-
2021-01-09 15:56:30
程序, 是描述现实世界,解决实际问题的。
例如:在百度搜索“动物”照片时,搜索的关键词“动物”,但是返回的都是动物的子类对象。
在现实世界中,存在的都是“动物”的子类对象,并不存在“动物”对象,所以Animal类不应该被独立创建对象。对于这样的场景,我们可以将动物类,设计为抽象类,抽象类不能被实例化对象,只是提供了所有的子类的共有的部分,为了给所有的子类定义公共属性abstract class Animal{ String name; int age; public void eat(){} }
抽象方法
abstract class Animal1 { String name; int age; public void bark() { }; } class dog extends Animal{ @Override public void bark() { System.out.println("won~"); } } class cat extends Animal{ @Override public void bark() { System.out.println("miao~"); } }
在上述代码当中,Animal类当中定义了一个bark方法,但是该方法无法满足子类的需求,如果一个方法在子类当中都进行了重写,但是在父类当中又没有实现,那么这个方法就没什么意义了,此时,如果实现该方法,显得冗余,如果不定义该方法,则表示所有的Animal类或子类无bark方法了,针对这样的情况,可以将这种方法定义为抽象方法。
抽象方法:使用abstract关键字定义的方法
1。特点:只有方法的声明,没有实现。且只定义在抽象类中
2。继承:非抽象类在继承抽象类时,必须重写父类当中的所有的抽象方法public abstract class Animal{ Strng name; int age; //抽象方法,只有声明,没有实现(方法体) //只能定义在抽象类中 public abstract void bark(); } class Dog extends Animal{ @Override public void bark(){ System.out.println(“won~”) } }
抽象方法使用的场景
在上文当中有提到,非抽象类在继承一个抽象父类的同时,必须重写实现父类当中所有的抽象方法,因此,抽象类可以做一些简单的规则制定。在抽象类当中指定一些规则,要求所有的子类必须实现,从而约束子类的一些行为。package Polymorphism; public abstract class Express { //制定所有的子类必须实现的方法 //要求所有的子类,都必须实现这个方法 public abstract void express(); } class Shunfeng extends Express{ //子类必须实现父类当中的抽象方法 @Override public void express() { System.out.println("顺丰快递!"); } class EMS extends Express{ //子类实现父类当中的抽象业务 @Override public void express() { System.out.println("EMS!"); } } }
在上述例子当中,快递抽象父类当中定义了抽象方法,发送快递。要求所有的子类必须实现。此时,父类中定义了所有的子类必须要实现的功能。
但是,如果抽象类进行行为的约束、规则的制定,又有很大的约束性,因为类是单继承的,一个类有且只能有一个父类。所以,如果一个类需要受到多种规则的约束,无法再继承其他的父类。此时,可以使用接口进行这样的复杂的规则制定。更多相关内容 -
如何调用抽象类中的抽象方法?以及如何调用接口中的抽象方法?
2021-10-13 12:08:00目录1. 如何调用抽象类中的抽象方法?2. 如何调用接口中的抽象方法? 1. 如何调用抽象类中的抽象方法? 2. 如何调用接口中的抽象方法?1. 如何调用抽象类中的抽象方法?
抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类。抽象类有点类似“模板”的作用,目的是根据其格式来创建和修改新的类。对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象。当一个类被声明为抽象类时,要在这个类前面加上修饰符abstract.
在抽象类中的成员方法可以包括一般方法和抽象方法。抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是abstract的,而这个子类也必须是抽象的,即声明为abstract.
抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类。抽象类本身不具备实际的功能,只能用于派生其子类。抽象类中可以包含构造方法,但是构造方法不能被声明为抽象。
调用抽象类中的方法(抽象方法和非抽象方法),如果方法是static的,直接 抽象类。方法 就可以了;如果是非static的则必须需要一个继承的非抽象类,然后用这个非抽象类的实例来调用方法。
抽象类可以实现接口,接口中的方法 在抽象类中可以不实现,当有子类继承 抽象类时,并且子类不是抽象类时,子类需要将抽象类中的 抽象方法和接口中的方法都实现
抽象类不能用final来修饰,即一个类不能既是最终类又是抽象类。
总结: abstract不能与private、static、final、native并列修饰同一个方法。
注意:子类继承父类方法后,这个子类对象如果执行方法的话,只要子类重写了就执行子类的,不执行父类的。
package xxx.java; public class AbstractTest { public static void main(String[] args) { //一旦Person类抽象了,就不可实例化(不能造对象了) // Person p1 = new Person(); // p1.eat(); } } abstract class Creature{ public abstract void breath(); } abstract class Person extends Creature{ String name; int age; public Person(){ } public Person(String name,int age){ this.name = name; this.age = age; } //不是抽象方法:有空的方法体 // public void eat(){ // // } //抽象方法 public abstract void eat(); public void walk(){ System.out.println("人走路"); } } class Student extends Person{ public Student(String name,int age){//父类Person中有构造器,所以子类可以使用父类中的构造器 super(name,age); } public Student(){ } //Student类不能调用父类中的eat方法(抽象方法),要使用eat方法要么额外在子类中把父类Person中的eat方法重写,要么把Student类也弄成抽象类(abstract class Student extends Person) //即:若子类重写了父类中的所有的抽象方法后,此子类方可实例化;若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰 public void eat(){ System.out.println("学生多吃有营养的食物"); } @Override public void breath() {//Student类继承Person类,Person类继承Creature类,Creature类用抽象类修饰了,故Student类要调用Creature类中的breath功能,则要么重写breath方法,要么Student类也抽象化 System.out.println("学生应该呼吸新鲜的没有雾霾的空气"); } }
在Person类中,抽象方法eat要省略方法体:
public abstract void eat();
我们不能直接通过造Person类的对象调用该eat方法(抽象类不能实例化,无法造抽象类的对象去调用该类中的方法),要调用eat方法,只能造Person类的子类(如Student类),在Student类(不再是抽象类)中重写父类中的所有抽象方法(重写之后的eat方法也不再是抽象方法)
注:若子类重写了父类中的所有的抽象方法后,此子类方可实例化;若子类没有重写父类中的所有的抽象方法则此子类也是一个抽象类,需要使用abstract修饰。即:
class Student extends Person{ public Student(String name,int age){//父类Person中有构造器,所以子类可以使用父类中的构造器 super(name,age); } public Student(){ } public void eat(){ System.out.println("学生多吃有营养的食物"); } @Override public void breath() {//Student类继承Person类,Person类继承Creature类,Creature类用抽象类修饰了,故Student类要调用Creature类中的breath功能,则要么重写breath方法,要么Student类也抽象化 System.out.println("学生应该呼吸新鲜的没有雾霾的空气"); } }
改为:
abstract class Student extends Person{ public Student(String name,int age){//父类Person中有构造器,所以子类可以使用父类中的构造器 super(name,age); } public Student(){ } public void eat(){ System.out.println("学生多吃有营养的食物"); } @Override public void breath() {//Student类继承Person类,Person类继承Creature类,Creature类用抽象类修饰了,故Student类要调用Creature类中的breath功能,则要么重写breath方法,要么Student类也抽象化 System.out.println("学生应该呼吸新鲜的没有雾霾的空气"); } }
但如果Student类又变成抽象类,则Student类又不能能通过造Student类的对象去调用Student类中的方法了。即如果不在Student类中重写父类Person中的全部方法,单纯在Student类前加abstract只能保证程序不出错而已。(本人不成熟的见解,有误望指出)
所以,一般来说,要想调用抽象类中的抽象方法,应该造该抽象类(父类)的子类,然后在子类中重写父类的全部方法,然后就可以通过造子类的对象去调用子类中重写过的方法。
2. 如何调用接口中的抽象方法?
JDK7及以前,接口中的方法一定是抽象方法(那么方法前缀没有abstract,也默认有)。
**接口中不能定义构造器的!**意味着接口不可以实例化(不能通过直接new对象去调用接口中的方法)。要用接口,得通过类去实现(implements)的方式来使用。(即把接口转换成类去使用):
package xxx.java1; public class InterfaceTest { public static void main(String[] args) { System.out.println(Flyable.MAX_SPEED); System.out.println(Flyable.MIN_SPEED); // Flyable.MIN_SPEED = 2;//就算48行省略了public static final,Flyable.MIN_SPEED依然不能赋值 Plane plane = new Plane();//75行开始重写了fly和stop方法,故可以new对象去调用Plane类中的属性方法了。 plane.fly();//通过传入该接口的实现类Plane的对象plane来调用接口Flyable中的方法 } } interface Flyable{ //全局常量 public static final int MAX_SPEED = 7900;//第一宇宙速度 int MIN_SPEED = 1;//可以省略了public static final //抽象方法 public abstract void fly(); //方法中可以省略了public abstract void stop(); //Interfaces cannot have constructors接口中不能定义构造器的!意味着接口不可以实例化 // public Flyable(){ // // } } class Plane implements Flyable{ //使用接口中的这两个方法时,由于接口中的方法是抽象方法,故在Plane类中要么重新实现一下这两个方法,要么将Plane类抽象化(class前面加abstract) //下面重新实现一下这两个方法: //如果实现类覆盖了接口中的所有抽象方(fly,stop)法,则此实现类就可以实例化 //如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类 @Override public void fly() { System.out.println("通过引擎起飞"); } @Override public void stop() { System.out.println("驾驶员减速停止"); } }
其中,Flyable接口中的方法是抽象方法,和上面讲的调用抽象方法的手法一样,我们需要在实现类Plane中重写Flyable接口中的所有方法,然后再造实现类Plane的对象plane去调用Flyable接口中的相应的方法(如fly)。
如果只是在class Plane implements Flyableqian前面加上abstract,虽然可避免报错,但还是无法调用Flyable接口中的方法(抽象类无法实例化)。
-
java抽象类和抽象方法
2021-02-27 12:26:26一、什么是抽象类和抽象方法没有具体功能的实现,通过子类继承后重写方法来实现一定约束的类称之为抽象类,抽象类必须被abstract修饰。抽象方法就是只有方法声明,没有方法体的方法。抽象类的使用一般通过继承来实现...一、什么是抽象类和抽象方法
没有具体功能的实现,通过子类继承后重写方法来实现一定约束的类称之为抽象类,抽象类必须被abstract修饰。抽象方法就是只有方法声明,没有方法体的方法。抽象类的使用一般通过继承来实现
二、为什么需要抽象类和抽象方法
引用抽象方法和抽象类,是java提供的一种语法工具,引导使用者正确的使用它们,减少误用。相当于对子类进行一定限制。
三、抽象类和抽象方法的语法规则及其注意事项
抽象类抽象方法必须被abstract修饰。
抽象类中可以有普通方法,但是有抽象方法的类必须是抽象类。抽象类中的普通方法因为不能被创建对象,所以不能使用这个普通方法。
抽象类除了不能实例化对象之外,类的其它功能依然存在。
抽象方法中可以有被static修饰main方法,并且可以执行。
一个类在继承抽象类后,必须实现抽象类中定义的所有抽象方法。除非它自己也声明为抽象类。
抽象方法名后面直接跟一个分号,而不是花括号。
四、抽象类和抽象方法的实现案例
1、抽象类中可以有普通方法,但是有抽象方法的类必须是抽象类。
public abstract class Demo01 {
public abstract void run();
public void test(){}
}
//编译通过,不报错
public class Demo01 {
public abstract void run();
public void test(){}
}
//报错:
Class 'Demo01' must either be declared abstract or implement abstract method 'run()' in 'Demo01'
Abstract method in non-abstract class
2、抽象类除了不能实例化对象
public abstract class Demo01 {
public abstract void run();
public static void main(String[] args) {
Demo01 demo01=new Demo01();
}
}
3、抽象方法中可以有被static修饰main方法,并且可以执行。
public abstract class Demo01 {
public abstract void run();
public static void main(String[] args) {
System.out.println("抽象类中的main方法");
}
}
//输出结果:抽象类中的main方法
4、抽象类的使用一般通继承来实现,且子类中要么对抽象类的方法进行重写,要么声明子类也为抽象类
public class Demo02 extends Demo01{
@Override
public void run() {
}
}
abstract class Demo03 extends Demo01{
}
//Demo02和Demo3均能编译通过。
5、抽象类中的静态方法可以用类名.方法名的方式调用
6、抽象的实例:
有抽象类Father,和抽象方法run()。
public abstract class Father {
private String name;
private int age;
private char sex='男';
public int money=100_000;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
abstract void run();
public void say(){
System.out.println("这是父类普通方法");
}
public static void go(){
System.out.println("这是父类静态方法");
}
}
有子类Son继承了抽象类,重写了父类的抽象方法run
public class Son extends Father{
private double salary;
@Override
void run() {
System.out.println("子类重写了父类的方法run");
System.out.println(super.getSex());
super.say();
}
public static void main(String[] args) {
Son son=new Son();
son.run();
System.out.println(son.getSex());
//System.out.println(super.getSex()); //错误
son.setAge(47);
System.out.println(son.getAge());
son.setName("ThreePure");
System.out.println(son.getName());
//调用父类的公有属性
System.out.println(son.money);
//使用继承于父类的方法
son.say();
}
}
运行结果:
子类重写了父类的方法run
男
这是父类普通方法
男
47
ThreePure
100000
这是父类普通方法
尽管我们不能实例化一个 Father类的对象,但是如果我们实例化一个 Son 类对象,该对象将从 Father 类继承 成员方法,且通过该方法可以设置或获取成员变量。
五、抽象类的其他补充吗
抽象类是否有构造器:
从图中我们可以知道抽象类也是有构造器的,并别在子类创建对象时被调用。
public abstract class Demo3 {
public Demo3() {
System.out.println("抽象类的构造方法");
}
}
public class Demo4 extends Demo3{
public static void main(String[] args) {
Demo4 demo4 =new Demo4();
}
}
//抽象类的构造方法
2、final与abstract的矛盾
final关键字可以修饰类、方法、变量。final修饰的类不能被派生;final修饰的方法,禁止子类重写。所以我们可以看出,final和abstract不能一起使用。
3、构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
-
抽象方法必须在抽象类中吗
2021-03-11 10:44:32抽象方法必须在抽象类中吗2020-07-01 15:01:18文/叶丹1、抽象方法必须在抽象类中,所以抽象类中的方法都必须是抽象方法。2、Final类中的属性和方法都必须被final修饰符修饰。3、最终类不能派生子类,最终方法不能被...抽象方法必须在抽象类中吗2020-07-01 15:01:18文/叶丹
1、抽象方法必须在抽象类中,所以抽象类中的方法都必须是抽象方法。2、Final类中的属性和方法都必须被final修饰符修饰。3、最终类不能派生子类,最终方法不能被覆盖。4、子类要调用父类的方法,必须使用super关键字。
抽象方法:
java中的抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。
抽象方法与抽象类:
当一个方法为抽象方法时,意味着这个方法应该被子类的方法所重写,否则其子类的该方法仍然是abstract的,这个子类由于继承父类,拥有抽象方法,因此它也是抽象类,即声明为abstract。abstract抽象类不能用new实例化对象,abstract方法只允许声明不能实现。如果一个类中含有abstract方法,那么这个类必须用abstract来修饰,当然abstract类也可以没有abstract方法。 一个抽象类里面没有一个抽象方法可用来禁止产生这种类的对象。
抽象方法与接口:
在interface中所有的方法都是public abstract的,即使你没有申明它是public abstract的。在interface中所有的数据成员都是public static final的,即使你没有申明.但不能是blank final 在编译时候确定的。在Java,interface的地位和class是一样的。实现interface的类,其interface中所有的方法必须被“实现”,否则这个类成为一个抽象类。Interface可以从多个interface得到继承,但是不能继承类。一个类可以实现多个interface。
-
七、java中的抽象类和抽象方法详解
2020-12-24 10:53:56为了表示『抽象』这一概念,我们使用abstract关键字表示——abstract类是抽象类,abstract方法是抽象方法。 2、什么是抽象类、抽象方法? 类用于描述现实生活中一类事物。类中有属性、方法等 -
抽象类和抽象方法的使用
2022-02-08 15:50:04有时候将一个类设计的非常抽象,以至于他没有具体的实例,这样的类叫做抽象类。 abstract关键字的使用 1、abstract可以用来修饰结构、类、方法 2、一旦父类抽象了,就不...抽象方法的定义:只有方法的声明,没有方法 -
抽象类是不是必须要有抽象方法
2021-08-15 23:57:30抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定... -
java抽象方法怎么写
2021-02-13 00:44:131. java中什么叫抽象方法和抽象类及他们的特点,说的具体些,写个例子7.何为抽象方法和抽象类?马 克 -to -win:方法前有个abstract修饰符,就叫抽象方法。类前有个abstract修饰符就是抽象类,完了,简单就好记。以下... -
011 抽象类必须要有抽象方法吗?
2021-02-28 14:53:53(有抽象方法就是抽象类,是抽象类可以没有抽象方法)解释:抽象方法:java中的抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不... -
【Kotlin】抽象类 ( 声明 | 抽象类成员 | 抽象类继承 | 抽象方法覆盖 | 抽象方法实现 )
2020-03-30 21:18:24抽象类总结 : ① 声明 : 抽象类中使用 abstract 声明 ; ② 成员 : 抽象类中既可以定义正常属性和方法 , 又可以定义抽象的属性和方法 ;...⑤ 特征 : 抽象方法只能定义在抽象类中 , 正常类中不能有抽象方法 ; -
在抽象类中可以没有抽象方法_是否可以在最终课程中使用抽象方法?
2020-06-28 21:45:52在抽象类中可以没有抽象方法 这是最近在Java开发人员工作面试的电话面试中向我的一位读者提出的有趣的Java核心问题之一。 即使他知道你 无法用Java将抽象类定型为final ,他对方法的措辞感到困惑。 答案很简单,不... -
利用实例巧妙区分“抽象方法”和“虚方法”!
2020-07-08 08:39:47抽象方法是指定义在抽象类中的方法,需要在子类中被实现的方法。而虚方法是指可以被子类覆盖的方法,或者说是可以被重写的方法。 目录 什么是抽象方法和虚方法? 抽象方法和虚方法的区别 举例分析方法的不同 ... -
C#中抽象类与抽象方法的详解
2020-06-17 17:41:11抽象类的含义是什么? 抽象类怎么创建? 抽象类的规则有哪些? 抽象方法? 抽象类被运用的意义是什么? -
Java抽象类和抽象方法归纳总结
2020-06-11 12:26:24GeometriObject中包含两个抽象方法:getPerimeter,getArea/ Triangle中实现了这两个方法 好了,进入正题。 目录一,抽象类关键点二,抽象类与抽象方法的定义1.抽象类2.抽象方法三,注意事项1.关于抽象类的构造函数... -
java中 抽象类里面可以没有抽象方法吗?为什么
2021-02-12 23:54:32展开全部这事我也疑问过,我认为这...抽象类有个特点:无法被创建对象,如果抽象类里面放了很多非抽象方法,可以利用这一点!2.abstract无法和final共存修饰类;但是抽象类里面可以用final与s... -
Java中的接口与抽象方法
2021-03-06 22:33:03Java中的接口与抽象方法时间:2017-06-27来源:华清远见JAVA学院今天华清Java学院小编来和大家分享一下Java中接口和抽象方法的一些知识。Java中接口是什么?什么是Java接口呢?接口在java中是一个特殊的类,不过再... -
JAVA 抽象类,抽象方法
2021-04-22 21:18:22如一个抽象类Animal中有一个抽象方法run.public class Animal{public abstract void run();}那么他的子类必须要实现run这个方法。不是实现的话编译就会报错。public class Dog{@Overridepublic void r... -
C#抽象类和抽象方法(很详细,你值得拥有!!!)
2020-06-18 19:10:32什么是抽象类? 什么是抽象方法? 抽象类和抽象方法有什么特性? 抽象类的使用场景? 抽象类的作用? 抽象类和接口的区别? 抽象类和抽象方法怎么声明? 抽象类和抽象方法如何使用? -
Java中的抽象方法是什么,怎么用?
2021-03-27 14:36:23抽象方法… 听着就很抽象的样子 脑中不禁浮现出了各种抽象画的图像 缩在被窝里打起了退堂鼓 但是! Java中的抽象没那么难 抽象方法是个啥? 通俗来说 就是不知道该咋做的方法 先别晕 我给你举个小栗子 我们创建一个... -
抽象方法没有方法体
2021-01-30 21:26:33抽象方法在父类中不能实现,所以没有方法体。 // 这就是一个抽象类 abstract class Animal { // 动物会叫 public abstract void cry(); // 不确定动物怎么叫的。定义成抽象方法,来解决父类方法的不确定性。抽象... -
Python中的抽象类和抽象方法
2020-03-14 11:02:45在python中类 通过继承metaclass =ABCmeta类来创建抽象类,抽象类是包含抽象方法的类,其中ABCmeta类(Metaclass for defining abstact baseclasses,抽象基类的元类)是所有抽象类的基类。 定义了抽象类后,在要实现... -
java – 抽象方法没有体?
2021-02-25 18:46:49你需要知道两件事-declaration:方法的原型或结构.例如:public int add(int a,int b);...}现在抽象方法可以有一个声明,即结构或原型.但它没有定义.定义应该在扩展包含抽象方法的类的类中完成:class A ... -
24、抽象方法和抽象类的写法
2020-12-06 22:03:47抽象方法和抽象方法的格式 抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束 抽象类:抽象方法所在的类,必须是抽象类才行,在class之前协商abstract即可 public abstract class Animal { //这... -
抽象类和抽象方法
2020-04-12 23:36:13抽象方法: 就是加上abstract关键字,然后去掉大括号,直接分号结束 抽象类:抽象方法所在的类,必须是抽象类才行,在class之前写上abstract即可。 如何使用: 1.不能直接创建new抽象类对象。 2.必须用一个子类,... -
Java抽象类和抽象方法如何定义
2020-11-18 23:46:06抽象类 具体的类是可以被初始化为对象的,在类的声明前面加上抽象类关键词abstract,则该类就会成为一个抽象类。 abstract public class Canine extends Animal { public void roam () {} } 编译器不会让你初始化... -
接口中只能定义常量和抽象方法,对么
2021-03-10 04:19:13接口中只能定义常量和抽象方法,对。在Java语言中,接口是一个抽象类型,是抽象方法的集合,通常以关键字interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口中只能定义常量和抽象方法,对... -
Java抽象类/抽象方法定义及其特性详解
2019-09-28 18:37:53类的继承结构中,越往上的类越具有通用性,也就越抽象。当它抽象到一定程度,就变成概念成框架,不能再产生实例化的对象了。例如“交通工具”,就无法用它...与抽象类紧密相连的是抽象方法一它总是用在抽象类或接口中。 -
抽象类必须要有抽象方法吗?
2021-02-22 10:40:33抽象类必须要有抽象方法吗? 答:不需要, 抽象类不一定有抽象方法;但是包含一个抽象方法的类一定是抽象类。(有抽象方法就是抽象类,是抽象类可以没有抽象方法) 解释: 抽象方法: java中的抽象方法就是以...