抽象方法
引入继承的思想,将共性的方法抽取到父类后,由于每个子类的方法执行内容各不相同,所以需要对每个子类的方法进行改写,此时的父类中被继承的方法体并不能确定具体内容,那么该方法就可定义为抽象方法
定义格式
public abstract 返回值 方法名 (形参);
抽象类
定义了抽象方法的类必须也为抽象类,即用 abstract 修饰一个方法后,其所在的类也必须用 abstract来修饰。
public abstract class Animal {
//成员变量
//成员变量
public abstract void eat(String something);
}
定义格式
public abstract class 类名 { }
抽象类的注意事项
1.抽象类不可以创建对象
可以看到创建对象将会报错
public abstract class Animal {
Animal S= new Animal();//此时new Animal 报错
}
删除 abstract 后,Animal 的对象可正常创建
public class Animal {
Animal S= new Animal();
}
2.抽象类中不一定有抽象方法,但有抽象方法一定是抽象类
3.抽象类的子类
要么重写抽象类中的所有抽象方法,要么是抽象类,其中,重写抽象类中的所有方法最为常用,见下文
为什么要整抽象方法和抽象类
格式统一
每个动物都会喝水,所以将猫和狗共性的方法 “喝水” 抽取到父类,而 “eat” 吃的方法却不能抽取,因为猫与狗吃的东西各不相同,“eat” 动作应该是每个动物所独有的方法,但是这样有很大的弊端,假如多个程序员同时编写此项目,他们对于 “eat” 方法所编写的格式也不尽相同,最终在test中运行时需要查看每个动物的 “eat” 方法是如何编写的,有无返回值?形参接收的是什么?实参该怎样写?最终调用每个动物的 “eat” 方法时都需要去子类查看 “eat”的格式,如此一来,动物种类一多,可能让大脑cup当场炸裂。
解决方法:将 "猫吃" 与 “狗吃” 中的 “吃” 抽取到父类并定义为抽象方法,让子类继承父类的 “eat” 方法并强制按照父类中的格式对其进行重写,这样,所有子类的 “eat” 内容各不相同,而格式都完全相同,日后在测试运行调用每个动物的 “eat” 方法时无需查看每个动物的 “eat” 格式,只需查看父类中的方法格式即可。