一、父类作为方法形参时
在调用该方法时,可以传入任何一个子类对象,此时,这个形参就有值了,值是传入的子类对象,当使用这个形参调用父类中的方法时:
- 如果子类没有重写父类方法,则调用的就是父类中的方法
- 如果子类重写过了父类的方法,则调用的就是子类中重写过的方法
- 不能调用子类中独有的方法,如果必须调用,则需要先进行强制类型转换(将父类引用转换为子类引用)
总结
父类引用指向子类对象时,在调用方法时,
如果子类没有重写父类方法,则调用的就是父类中的方法;
如果子类重写过了父类的方法,则调用的就是子类中重写过的方法,并且该引用(对象)不能在调用子类中独有的方法,
如果必须调用,则需要先进行强制类型转换(将父类引用转换为子类引用)
当父类的类型声明的对象,值是子类对象时,就叫做父类引用指向子类对象
案例:
父类 对象名 = new 子类构造方法();
此时
对象名就叫做引用,其类型就是声明的父类的类型
=就表示指向
new 子类构造方法()其实就是在创建子类对象
因此
这就叫做父类引用,指向子类对象
当调用有参方法时,实际上就是将实参赋值给形参
public void calc(int a,int b){...}
调用:calc(1,2);
其实就等价于,int a = 1;int b = 2;
public void feed(Pet pet){...}
feed(dog);
就等价于: Pet pet = dog;
又因为:dog = new Dog();
所以:Pet pet = new Dog(); 这就是父类引用指向子类对象
二、实现多态的三要素
- 编写具有继承关系的父类和子类
- 子类重写父类方法
- 使用父类的引用指向子类的对象
三、instanceof运算符
在强制类型转换中,如果没有转换为真实子类类型,就会出现类型转换异常,怎么办?
在Java中,提供了instanceof运算符来判断对象的类型
语法
对象名 instanceof 类或接口
使用经验
- 使用instanceof运算符时,对象的类型必须和instanceof的第二个参数所指定的类或接口在继承树上有上下级关系,否则会出现编译错误
- instanceof通常和强制类型转换结合使用