當編譯時型別與執行時型別不同時

2021-09-01 08:16:15 字數 855 閱讀 3661

class base 

public void display()

}class derived extends base

public void display()

}public class test

}

以上**輸出結果為0

**行的注釋表示執行順序;

1:系統先為derived物件分配記憶體空間,有兩塊記憶體空間分別存放derived物件的兩個i例項變數,乙個是屬於base的乙個是derived的,此時這兩個i例項變數的值都是0;

2:執行derived類的構造器之前,先執行base類的構造器。表面上看,base類經過編譯器處理後,其構造器包含如下兩行**:

i  =  2; 

this.display();

3: this.display();中的this在這裡是指向derived的,即實現子類的方法覆蓋父類的方法

4:此時derived的i還沒有經過初始化,為0,故輸出0

5:derived的i初始化

6:derived的構造器

將base類的構造器改為如下形式:

public base()
再次執行程式,將看到輸出是2和0;

當變數的編譯時型別和執行時型別不同時,通過該變數訪問它所引用的物件的例項變數時,該例項變數的值由宣告該變數的型別決定,但通過該變數呼叫它引用的物件的例項方法時,該方法行為由它實際所引用的物件來決定,一次當程式訪問this.i時,它將訪問base類中定義的i例項變數,也就是將輸出2;但執行 this.display()時則實際表現出derived物件的行為,也就是輸出derived物件的i例項變數,即為0。

iOS編譯時型別與執行時型別

首先我們來寫乙個物件 nsstring obj nsdata alloc init 一般來說我們寫完上面的 xcode會為我們提示乙個warning incompatible pointer types intializing nsstring with an expression of type ...

C 中的執行時型別與編譯時型別

今天在看c 參考時明白了 什麼是c 的執行時型別與編譯時型別,記錄下來,以備查閱 相信很多剛學c 的人都對這兩個概念感到迷惑,其時並不難 以前太重於技術可用性,比如 asp.net中的datadrid怎麼用等問題,沒大研究過這方面 希望能對c 初學者有所幫助。請看如下 class aclass bc...

執行時型別識別

執行時的型別識別 rtti 分為兩類 1.typeid操作符 2.dynamic cast操作符 先看第二種 dynamic cast完成將基類型別的指標或者引用安全轉化為派生類型別的指標和引用。對於指標,如果轉化失敗,則將指標置為null,對於引用型別,因為沒有null,所以直接丟擲bad cas...