在這樣的情況:多態性和繼承
class A{
public int x = 4;
public void s3(){
x = 3;
}
public void f(){
x = 8;
s3();
}
}
class B extends A{
public int x = 5;
public void f(){
x = 10;
s3();
}
}
A a = new B();
B b = (B) a;
a.f();
System.out.println(b.x);
System.out.println(a.x);
a.f()
調用類B
,然後f()
的f()
,轉讓後,調用s3()
功能。此時,s3()
僅在A
中定義,當它將值3分配給x
時,x
是A
類擁有的變量的副本。爲什麼s3()
不使用B
中聲明的x
?理論上,B
不應該有自己的副本s3()
函數繼承自A
? (所以s3()
從A
繼承了B
應該使用B
宣佈x
)
爲了將來的參考,對所有變量,方法和類名使用單個字符作爲名稱會使代碼難以遵循。 –
「爲什麼's3()'不使用'B'中聲明的'x'?爲此'B'應該重寫's3()',這與繼承不同。 –