2010-11-15 69 views
3

我哈瓦關於構造鏈接的程序的輸出我發現下面輕微的疑問:構造鏈接在Java中

class Cube { 

    int length; 
    int breadth; 
    int height; 
    public int getVolume() { 
     return (length * breadth * height); 
    } 
    Cube() { 
     this(10, 10); 
     System.out.println("Finished with Default Constructor of Cube"); 
    } 
    Cube(int l, int b) { 
     this(l, b, 10); 
     System.out.println("Finished with Parameterized Constructor having 
            2 params of Cube"); 
    } 
    Cube(int l, int b, int h) { 
     length = l; 
     breadth = b; 
     height = h; 
     System.out.println("Finished with Parameterized Constructor having 
            3 params of Cube"); 
    } 
} 

public class SpecialCube extends Cube { 

    int weight; 
    SpecialCube() { 
     super(); 
     weight = 10; 
    } 
    SpecialCube(int l, int b) { 
     this(l, b, 10); 
     System.out.println("Finished with Parameterized Constructor having 
            2 params of SpecialCube"); 
    } 
    SpecialCube(int l, int b, int h) { 
     super(l, b, h); 
     weight = 20; 
     System.out.println("Finished with Parameterized Constructor having 
            3 params of SpecialCube"); 
    } 
    public static void main(String[] args) { 
     SpecialCube specialObj1 = new SpecialCube(); 
     SpecialCube specialObj2 = new SpecialCube(10, 20); 
     System.out.println("Volume of SpecialCube1 is : " 
       + specialObj1.getVolume()); 
     System.out.println("Weight of SpecialCube1 is : " 
       + specialObj1.weight); 
     System.out.println("Volume of SpecialCube2 is : " 
       + specialObj2.getVolume()); 
     System.out.println("Weight of SpecialCube2 is : " 
       + specialObj2.weight); 
    } 
} 

OUTPUT:

Finished with Parameterized Constructor having 3 params of SpecialCube 
Finished with Parameterized Constructor having 2 params of SpecialCube 
Volume of SpecialCube1 is : 1000 
Weight of SpecialCube1 is : 10 
Volume of SpecialCube2 is : 2000 
Weight of SpecialCube2 is : 20 

的疑問是關於輸出如何「1000 「,」10「,」2000「&」20「是否被提交?

在主類,我們已經創建了兩個對象:

SpecialCube specialObj1 = new SpecialCube(); 
SpecialCube specialObj2 = new SpecialCube(10, 20); 

先用「無參數」和第二,「兩個參數」,第一個構造立方()的「無參數」只有兩個值this(10,10)和一個與「兩個參數」的值有

Cube(int l, int b) 
    {this(l, b, 10);} 

我不明白下面的輸出是如何生成的。

Volume of SpecialCube1 is : 1000 
Weight of SpecialCube1 is : 10 
Volume of SpecialCube2 is : 2000 
Weight of SpecialCube2 is : 20 

請任何人都可以幫助我!

感謝, 大衛

+2

嘗試調試代碼,它可以跟蹤流量 – 2010-11-15 10:08:26

+0

運算似乎是錯誤的。應該打印在立方體報表的最佳方式()構造函數第一個 – shaunak1111 2013-11-11 07:30:41

回答

3

我認爲這是顯而易見的。 specialObj1在缺省構造函數中創建,該構造函數調用1個參數構造函數,該構造函數調用3個參數構造函數。每個調用發送10作爲多維數據集維度的值。因此,音量是10 * 10 * 10 = 1000;

重量不是方法。它是在默認和3-arg構造函數中初始化的字段。由於構造函數的第一件事是調用this(...),所以在其他構造函數中賦予此變量的值無關緊要。鏈中的第一個構造函數實際上覆蓋了以前設置的所有值。這是第一個物體重量= 10的原因。

第二個目的是使用2參數的構造被稱爲具有參數10和20創建的,所以體積爲10×20×10 = 2000。(第二10時2args構造函數調用3args構造方法設置。) 在的情況下,第二個對象的權重由3-args構造函數設置,因爲2-args構造函數不會覆蓋此值。

我希望這會有所幫助。

+1

無參數構造函數是一個不帶任何參數的構造函數。當沒有其他構造函數可用於該對象時,默認構造函數是編譯器提供的對象的無參數構造函數克拉。在這個例子中沒有默認的構造函數! – 2013-01-07 16:43:37

4

好了,讓我們一個情況下,在一個時間。對於第一版本,構造鏈雲:

SpecialCube() 
Cube() 
Cube(10, 10) 
Cube(10, 10, 10) 

所以立方體1000的體積,並且在10默認權重(如SpecialCube參數構造指定)結束。

在第二種情況下,在構造鏈看起來像這樣:

SpecialCube(10, 20) 
SpecialCube(10, 20, 10) 
Cube(10, 20, 10) 

和重量由SpecialCube(int l, int b, int h)參數構造設定爲20 - 所以我們有2000的體積和20

的重量

如果這仍然不能解釋你的一切,請問一個非常具體的問題 - 最好是一個的案件,說明哪一點你不明白。

7

當你調用SpecialCube(),流程是這樣的(僞代碼):

SpecialCube() 
    -> Cube() 
    -> Cube(10,10) 
     -> Cube(10,10,10) 
      l:=10, b:=10, h:=10 
      print message "Finished with Parameterized Constructor having 3 params of Cube" 
     print message "Finished with Parameterized Constructor having 2 params of Cube" 
    print message "Finished with Default Constructor of Cube" 
    weight:=10 

,並在結束時,你有一個立方體構建(l,b,h) = (10,10,10)

0

打破它:

SpecialCube1默認構造,所以調用默認構造函數SpecialCube(),這又調用super(),其中默認co nstructs Cube(),這將解釋前兩個。

其中SpecialCube2遵循SpecialCube正確的構造函數鏈。

0

這裏這些輸出中產生,因爲

SpecialCube1的體積是:1000 //第一時間時函數getVolume被調用時,它是越來越10,10,10,作爲參數 遵守以下代碼其中l, b,H值被分配給長度,寬度,高度

Cube(int l, int b, int h) { 
//l=10,b=10,h=10 

System.out.println(l); 
System.out.println(b); 
System.out.println(h); 
    length = l; 
    breadth = b; 
    height = h; 

SpecialCube1的重量爲:10 //在第一構造權重分配給10(即第一對象)

SpecialCube2的體積爲:2000 //第二次getVolume函數獲得來自specialcube的參數(3 argmted constr ie 10,20,10; SpecialCube2的

SpecialCube(int l, int b, int h) 
{ 
//l=10,b=20,h=10 
    super(l, b, h); 
    System.out.println(l); 
System.out.println(b); 
System.out.println(h); 
    weight = 20; 

重量爲:20 //在第二構造權重分配給20(即第一對象)

SpecialCube(INT升,INT B,INT 1H) { // L = 10,b = 20,H = 10

super(l, b, h); 
    System.out.println(l); 
System.out.println(b); 
System.out.println(h); 
    weight = 20; 
1
這裏

執行流的下方,

步驟1:當「SpecialCube specialObj1 =新的特別立方體();」執行,默認構造函數「SpecialCube()」將被調用。

第2步:現在「超級()」將excuted叫「SpecialCube的」超班「魔方」。步驟3:現在將執行超類「cube」中的「this(10,10)」,它將從同一個類「cube」中調用2個參數的構造函數,即「Cube(int l,int b )「通過傳遞參數(l = 10,b = 10)。步驟4:現在「將在步驟#3中傳遞的實際參數執行」this(l,b,10)爲「this(10,10,10)」,它將調用3參數化構造函數「Cube(int升,INT b,INT h)」時,與來自步驟#3的傳遞值,這將是象 「魔方(INT升= 10,INT b = 10,INT H = 10)」

步驟5:實例第1步:然後java會在構造函數「SpecialCube()」中將「Weight」變量賦值爲10,這個變量的長度爲10,寬度爲10,高度爲10,對於在步驟1創建的對象「specialObj1」 」。(參照步驟#1)

現在參見方法執行對於對象 「SpecialCube()」(我只是僅考慮 「specialObj1」

步驟7:的System.out.println(「SpecialCube1的體積是: 「+ specialObj1.getVolume());,當這個語句執行時,java將調用超類」Cube's「」getVolume()「方法,因爲子類」SpecialCube「通過關鍵字」extends「來引用,在你的子類中引用。

公共類SpecialCube延伸立方

步驟8:步驟1通5,已經分配instanace變量爲「長度= 10,寬度= 1 0,heigth = 10「,你的音量變成」1000「。

步驟9: 「的System.out.println(」 SpecialCube1的重量是:「+ specialObj1.weight); - 此語句打印 「重量」 變量的值作爲 「10」,因爲步驟6#

希望,這將解釋reason.Try相同的流爲對象「specialObj2」。