Ich habe gerade angefangen zu vermuten, dass, da die Mitgliedsvariablen der übergeordneten Klasse und der untergeordneten Klasse jeweils im Heap gespeichert sind, dies möglicherweise daran liegt, dass die übergeordnete Klasse vorhanden ist und daher zuerst die Mitgliedsvariablen der übergeordneten Klasse gefunden werden. Dann habe ich es getestet und der Code ist wie folgt:
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);
}
}
Die Ausgabe ist:
Z:test.Z@15db9742
Z:5
f:test.Z@15db9742
f:10
f und this verweisen auf dasselbe Objekt und greifen auf dieselbe Variable zu, aber die Ergebnisse sind unterschiedlich, daher muss meine obige Vermutung falsch sein. Was genau führt also dazu, dass polymorphe Aufrufe von Membervariablen mit demselben Namen auf Membervariablen der übergeordneten Klasse zugreifen?
f指的是子类对象。只听过方法的重写和重载,没有类变量的重写和重载吧,我运行的程序,它分情况了,如果是调用方法,就是实际所指的对象(这里实际对象是子类对象Z)的方法,如果是类变量同名了,就是生命对象的类变量值。
java中方法的重写,重载与动态链接构成多态,多态就是同一个事物的不同表现形式。
你这个例子是方法的重写表现出来的多态性。
声明的是父类F,实际上指向他的子类Z,这个时候是相当于一个向上类型转换,因为Z也是由F继承过来的,所以可以向上转型,现在Z是F类型的。
所以这里f变量由Z实例化出来的,但是它是F类型的,表现出来的是F的特性。