Java 父类引用指向子类对象 学习
Java父类指针指向子类对象
在使用Java语言的时候,发现好多代码是这样写的
Parent obj = new Child();
即父类指针指向了子类对象,这样写有什么好处呢?
这其实是实现多态的一种方法。
什么是多态
多态是指同一个行为具有多个不同表现形式或形态的能力。
即多态就是同一个接口,使用不同的实例而执行不同的操作。
多态存在的三个必要条件
- 继承
- 重写(Override)
- 父类引用指向子类对象:
Parent o = new Child();
public class parent{
void show() {
System.out.println("parent show");
}
}
public class child extends parent{
@Override
void show() {
System.out.println("child show");
}
}
如上,child类重写了父类的show方法。
public class test {
public static void main(String[] args) {
parent o = new child();
o.show();
}
}
此时,o.show()
将输出child show
,即优先调用子类的该方法。
如果将子类的show方法删除,那么就会调用父类的show方法
这就是多态的表现。
练习
父类
public class parent{
public void func1() {
func2();
}
public void func2() {
System.out.println("parent func2");
}
}
子类
public class child extends parent{
public void func1(int num) {
System.out.println("child func1");
}
@Override
public void func2() {
System.out.println("child func2");
}
}
parent p = new child(); p.func1();
会输出什么呢?
child类继承了parent类,并重载(overload)了父类fun1方法,重写了(override)func2方法。
使用p对象调用func1()方法,由于子类中没有func1()(注意,子类重载的func1方法不一样)。
所以会调用父类的func1(),父类的func1()调用了func2()方法,由于子类重写了func2()方法,会优先调用子类的func2()
故结果输出是“child func2”
总结
父类引用指向子类对象特点如下(即Java多态特点):
- 使用父类引用指向子类对象
- 该引用只能调用父类中定义的方法和变量
- 如果子类重写了父类的某一个方法,那么调用该方法时会调用子类的这个方法
- 变量不能被重写(override),该概念只针对方法。