抽象类
抽象方法:为了防止子类不写或漏写“方法重写”。我们之前做过练习,就是在父类当中的work方法随便写了一个代码体,原因是,知道子类的work行为是与父类不同的,并且是会进行方法重写的。如今为了防止前面的弊端,我们在父类当中利用abstract关键字声明work行为,这样一来,在父类中work方法可以不需要具体的行为,但前提是确定子类必须对其进行重写。这个时候,被abstract修饰的方法就叫做抽象方法,所在的类就叫做抽象类。
准确定义:将共性行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样的,所以,在父类当中不能确定具体的方法体。那么该方法就是抽象方法
- 抽象方法定义格式:public abstract 返回值类型 方法名(参数列表);(不写方法体)
- 抽象类的定义格式:public abstract class 类名{}
抽象类、方法的注意事项: - 抽象类不能被实例化(不能创建对象)
- 抽象类当中不一定有抽象方法,但由抽象方法的类一定是抽象类
- 抽象类可以有构造方法
- 抽象类的子类(1.要么重写抽象类当中的所有抽象方法;2.要么其本身也是抽象类)
抽象类中的构造方法的作用当创建子类对象时,用于给子类所继承的属性赋值。因为抽象类本身,他是一个父类。
拓展
抽象类和抽象方法的意义何在?
疑问:
- 1.把子类的共性行为抽取到父类当中,由于方法体的不确定,进行了抽象方法。
2.抽象方法写完后子类又必须进行方法重写。
3.那么为什么不把方法当作子类的特有行为,直接把方法写进子类中呢?
原因:
实际开发中,一个项目是由多人共同完成的,每个人的代码思维、想法、能力水平不同,写出的代码具有差异性。比如,一个人写cat类中吃饭这个行为,但他认为这个行为需要一个返回值,并且他希望将吃饭这个行为命名为123,而另一个人负责写dog类中的吃饭这个行为,但他认为这个行为不需要返回值,并且他愿将这个行为命名为eat,那么问题就来了,当需要,创建不同的对象,且都要调用吃饭这个行为时,就需要查看每一个类对吃饭这个行为的命名,非常的麻烦,而且不利于别的程序员接手。所以,我们必须要设定抽象类。
对代码public abstracte void eat();的正确解读为:
- 1.子类必须重写eat方法
2.吃饭这个行为必须被命名为eat
3.这个方法被规定了没有返回值 - 抽象类的作用是什么?
抽取共性,当无法确定方法体时,就把方法定义为为抽象的
强制让子类按照某种格式重写方法(这包括方法名、返回值、权限)
抽象方法所在的类,必须是抽象类 - 抽象类和抽象方法的格式?
public abstract 返回值类型- 方法名(参数列表);
public abstract class类名{} - 继承抽象类有哪些要注意的?
要么重写方法
要么也成为抽象类(反正就是不能继承,想要继承就要在创建一个子类,而且这个子类当中还必须进行方法重写,无限套娃)