java 子類執行個體化時是否同時存在一個父類對象. 2011-10-14
19:53
提問者: luoyuehao89 | 瀏覽次數:602次
java 子類執行個體化時是否同時存在一個父類對象.假如父類A中有個int a = 1;子類B繼承A,同時B中覆蓋個int a = 2;運行:A test = new B();system.out.println(test.a);結果是1,是父類中的屬性.這個時候是否存在父類對象,我的理解是存在的.我又試,把父類用抽象abstract修飾,按理說abstract累不能執行個體化吧,肯定不能得到父類中的a屬性,結果還是一樣的.怎麼理解.
問題補充:
是不是建立子類對象,肯定會出現一個父類的對象?
我來幫他解答
檢舉 | 2011-10-22
16:33
精彩回答
不會產生父類對象,只是用了父類的建構函式而已,並不是用到建構函式就會產生對象,建構函式只是起對象初始化作用的,而不是起產生對象作用的,如果new A();即只有new語句才會產生父類A的對象。變數是靜態繫結 ,方法是動態綁定。 這裡面變數在編譯期間實現了變數調用語句與變數定義指派陳述式的綁定,綁定的自然是父類的,因為調用時類型是父類的,所以值是父類中定義的值 其實你可以這麼理解 建立了一個子類對象時,在子類對象記憶體中,有兩份這個變數,一份繼承自父類,一份子類。 絕對不會產生父類對象,父類中的成員被繼承到子類對象中,用指向子類對象的父類引用調用父類成員,只不過是從 子類對象記憶體空間中找到那個被繼承來的父類成員,也就是說實質是用子類對象調用變數a,這樣就可以解釋成員必須通過對象調用的規定,只不過這時調用的是子類對象中的繼承自父類的a(子類對象中有兩個a,一個繼承自父類,一個屬於自己)哎,話說的有些亂。 這個問題也困惑我很久,上網查詢發現很多人是錯誤的,最後找到幾篇好的文章才明白,可能很多java老手也都會犯“產生父類對象”這個錯誤,最近才搞明白。你自己想想,如果產生父類對象,如果父類是抽象類別,抽象類別允許產生對象嗎?所以這種說法不嚴謹
package jc.cn;public class Car{ public int a; public int b;}class Truck extends Car{ byte c; byte d;}class Smp{ public static void main(String[] args) { Truck t=new Truck(); }}當執行完下句後:Truck t=new Truck();求對象的記憶體模型圖?
我來幫他解答
檢舉 | 2009-11-17 07:55
滿意回答
左邊是棧空間,右邊是堆空間,棧空間的變數t儲存著一個指向堆空間某個對象的地址
動態綁定定義
動態綁定是指在執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法編輯本段靜態繫結與動態綁定
除了限制訪問,訪問方式也決定哪個方法將被子類調用或哪個屬性將被子類訪問. 函數調用與函數本身的關聯,以及成員訪問與變數記憶體位址間的關係,稱為綁定. 在電腦語言中有兩種主要的綁定方式,靜態繫結和動態綁定. 靜態繫結發生於資料結構和資料結構間,程式執行之前. 靜態繫結發生於編譯期, 因此不能利用任何運行期的資訊. 它針對函數調用與函數的主體,或變數與記憶體中的區塊.. 動態綁定則針對運行期產生的訪問請求,只用到運行期的可用資訊. 在物件導向的代碼中,動態綁定意味著決定哪個方法被調用或哪個屬性被訪問,將基於這個類本身而不基於存取範圍.