刚开始猜测,由于父类和子类的成员变量在堆中各存一份,可能是父类的存在上面,因此先找到的父类的成员变量。然后测试了一下,代码如下:
package test;
public class Polymorphism {
public static void main(String[] args) {
F f = new Z();
f.show();
System.out.println("f:"+f);
System.out.println("f:"+f.a);
}
}
abstract class F{
int a = 10;
public abstract void show();
}
class Z extends F{
int a = 5;
public void show(){
System.out.println("Z:"+this);
System.out.println("Z:"+this.a);
}
}
输出为:
Z:test.Z@15db9742
Z:5
f:test.Z@15db9742
f:10
f与this指向同一个对象访问同一个变量结果却不同,所以我上边的猜测应该是错的。那究竟是什么原因导致多态调用同名成员变量,访问的是父类的成员变量这种情况?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
java中方法的重写,重载与动态链接构成多态,多态就是同一个事物的不同表现形式。
你这个例子是方法的重写表现出来的多态性。
声明的是父类F,实际上指向他的子类Z,这个时候是相当于一个向上类型转换,因为Z也是由F继承过来的,所以可以向上转型,现在Z是F类型的。
所以这里f变量由Z实例化出来的,但是它是F类型的,表现出来的是F的特性。