18. 抽象类
1.抽象分析
需求:定义一个狗类和鸟类,并且具备叫的方法,例如 汪汪 叽叽喳喳
方案:定义一个父类(基类)Animal,并且有动物的名字和叫法。
再定义2个子类继承父类
苦恼:动物一般都有叫的行为,但是叫法又不同,那我在父类如何定义叫的成员函数呢?
解决1:不写叫的行为(成员函数),但是如果不写是不是可以认为动物没有叫的能力呢?
违背我们类的定义,否定方案。
解决2:定义行为,但不写具体的实现------抽象方法。
例如:
abstract class Animal {
//定义抽象方法
abstract void shout();
}
解决2可行的原因分析:
- 没有违背类的定义标准,动物都有叫的行为。
- 因为父类没写具体的实现,所以子类有更多的可变性。
例如:
class Dog extends Animal {
void shout() {
System.out.println("旺旺");
}
}
2. 使用abstract
1)定义:
当描述一个类的时候,如果不能确定功能函数如何定义,那么该类就可以定义为抽象类,功能函数应该描述为抽象函数。
2)语法:
abstract public void shout();
3. 定义抽象方法时注意事项:
1)抽象类中不一定要有抽象函数,但有抽象方法的类,一定时抽象类。
2)抽象类不能使用new创建对象
原因:创建对象是因为我们要调用类里面的方法,但是抽象方法没有具体的实现,不能调用。
3)如果子类继承的父类是抽象类,那么子类要实现父类的全部抽象方法
注意:可以不实现,前提是子类的也要声明为抽象的。
4)final与abstract不能共存:
final:它的作用 修饰类代表不可以继承 修饰方法不可重写
abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。
5)static 修饰的方法可以用类名调用,
对于abstract修饰的方法没有具体的方法实现,所有不能直接调用,也就是说不可以与static共存。
6)private
private修饰的只能在本类中使用,
abstract方法是用来被子类进行重写的,有矛盾所有不能共存.
7)抽象方法一定有构造方法
因为要初始化成员变量
4.抽象方法优点
1)提高代码复用性
2)强制子类实现父类中没有实现的功能
3)提高代码的扩展性,便于后期的代码维护