public
class
t1
public
void
test2()
} public
class
t2extends
t1
public
static
void
main(string args)
}
首先明確:
子類定義了和父類相同的變數,不會覆蓋變數值,也就是說,各是各的。
t1 test = new t2();
這是建立父類的引用,子類的例項。
test.test1();
這裡輸出:0
因為test1(),調的父類方法,值沒被覆蓋,所以是父類 i=0 的值。
同時我們知道,子類覆蓋父類方法,建立的子類例項,缺省會調子類的方法:
test.test2(); 是子類的方法, 當然也是子類的i=2的值
system.out.println(test.i);
輸出0
這句是父類的引用,指向父類的i=0的值
test = (t2)test;
這句實際沒任何效果,因為你已經是子類的例項,再對例項進行轉換,最多型別比較一次
因此,後面的 system.out.println(test.i); 值,還是父類的i=0;
當然,如果你 t2 t2 = (t2)test;
那麼就轉化成子類的引用,你再調 i 的時候就會用到t2 的值
我的理解是這樣的
成員變數的選擇是通過靜態繫結的,也就是在編譯期間決定,也就是通過引用變數決定,而不是通過實際物件決定,
比如 class a
class aa extends a
那麼 a a = new aa();
那麼這個時候,a就是引用變數,真正的物件時new aa()創造的物件,成員變數的選擇是由引用型別決定
這個時候,a.t就是代表父類中的成員變數,
這就是所謂的靜態繫結,所以也就是出現了隱藏,相同道理,static方法也有隱藏的現象,
而普通的方法,則是動態繫結了,也就是由物件型別決定,而不是引用型別決定了,這就是哦我們平時所說的多型
樓主,可以不用給太多分的
java 繼承中的 成員變數
之前看到了 這麼一段 子類中 出現了 和父類 成員同名的 成員變數後的取值問題 如下 class superclass public superclass int number public int getnumber class subclass1 extends superclass class...
繼承中的同名成員變數處理方法
1 當子類成員變數與父類成員變數同名時 2 子類依然從父類繼承同名成員 3 在子類中通過作用域分辨符 進行同名成員區分 在派生類中使用基類的同名成員,顯式地使用類名限定符 4 同名成員儲存在記憶體中的不同位置 總結 同名成員變數和成員函式通過作用域分辨符進行區分。如下 include using n...
java 繼承中的成員函式(方法)2
子類和父類中定義了一模一樣的方法 在類中的構造和一般的方法中在沒有繼承關係時都有乙個預設的this 用於找到當前的物件 在建立了繼承關係後,在子類中有乙個super 指向父類的引用 標誌這兩個類之間的關係 找方法也和變數一樣先在物件中找,沒有再去父類中找 class fu class zi exte...