Java 面向对象-抽象类
2020.02.27 19:27
2020.02.27 19:27
1. 抽象类
接上节,我们创建了一个Animal
父类,有两个子类(Cat
、Dog
)去继承该父类,然后重写父类中的方法,来实现多态的效果。
如下代码:
public class Animal {
public void shout() {
System.out.println("动物叫...");
}
}
但实际上,我们我们只使用了两个子类中重写的shout
方法,并没有使用父类的shout
方法,所以可否将父类中的具体实现去掉?
可以,但是去掉实现的方法必须用abstract
修饰,该方法就称为抽象方法
public abstract void shout();
若某个类中有抽象方法,该类也必须使用abstract
修饰,该类也就称为抽象类
所以,原来的Animal
父类,就变成了:
package test04;
public abstract class Animal {
public abstract void shout();
}
是不是简洁了很多?
但是,是抽象类,那意味着无法实例化此类,否则会编译报错。
无法实例化的抽象类有什么用?
因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。
当我们定义了抽象类Animal
,以及具体的Dog
、Cat
子类的时候,我们可以通过抽象类Animal
类型去引用具体的子类的实例:
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
doShout(cat);//传入的是Animal类型
doShout(dog);//传入的是Animal类型
}
面向抽象编程的本质就是:
- 上层代码只定义规范(例如:abstract class Animal);
- 不需要子类就可以实现业务逻辑(正常编译);
- 具体的业务逻辑由不同的子类实现,调用者并不关心。
本节阅读完毕!
(分享)