多态=对象的多种形态
继承是多态的实现基础
一. 引用的多态
- 父类的引用可以指向本类的对象
Animal obj1=new Animal();
- 父类的引用可以指向子类的对象
//Dog类是Animal的子类
Animal obj2=new Dog();
//相当于你是一条狗,而你对外声明你是一个动物,而系统觉得你是一个动物,他就不会让你调用狗的方法
//obj2是一个Dog类型的,可以调用与父类共有的属性和方法,但不能调用Dog类相对于父类【特有】的方法。
二. 方法的多态
即子类不满意父类的某个方法进行重写
//Animal中eat()方法
public void eat(){
system.out.println("动物可以吃东西");
}
//Dog中eat()方法
public void eat(){
system.out.println("狗喜欢骨头");
}
//定义两个对象
Animal obj1=new Animal();
Dog obj2=new Dog();
obj1.eat();//输出“动物可以吃东西”
obj2.eat();//输出“狗喜欢骨头”
三. 多态中的引用类型转换
- 向上类型转换(隐式自动转换)(小类型到大类型)(无风险)
- 向下类型转换(强制类型转换)(大类型到小类型)(有风险)
Dog dog=new Dog();
Animal animal=dog;//进行了向上转换
Dog dog2=(Dog)animal;//进行了向下类型强制转换,而直接Dog dog2=animal会报错。
//一二两句等价于:
Animal animal=new Dog();
- instanceof方法(用来避免强制转换出现的问题)
//instanceof返回一个布尔值,使用方法:
<实例对象名> instanceof <类名>;
//意思:animal是不是Dog类型,是则返回true,否则返回false。
animal instanceof Dog;
四. 抽象类
abstract关键字
抽象类关注子类具有的特征,但不注重子类如何去实现。
应用场景
- 在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
- 从多个具有相同特征的类中抽象出一个抽象类作为这些类的父类(即模板),从而避免子类设计的随意性。
注意:
- abstract可以定义抽象类也可以定义抽象的方法
- 包含抽象方法的类必须是抽象类
- 抽象类可以包含普通方法,也可以没有抽象方法
- 抽象类不能直接创建(实例化),但可以定义引用变量。即引用的多态<父类的引用可以指向子类的对象>
使用方法:
public abstract class Animal(){
abstract void eat();
}
网友评论