2011-02-26 63 views
2

好吧,所以這一直與我搞砸。 (雙關語?)這個關鍵字和繼承 - Java

忽略的變量類型,因爲這不是問題

比方說你有一個父類,例如書類,具有可變ISBN。構造函數使用this.ISBN = bla設置ISBN。

現在有一個孩子班。它有一個構造函數,它在其中調用父類。首先,構造者是如何形成的?喜歡這個? :

public kidsBook(ISBN, kidVariable) { 
    super(ISBN); 
    this.kidVariable = kidVariable; 
} 

這是正確的做法嗎?如果這樣會引發第二個問題:來自父類的this.ISBN,當父子構造函數在子構造函數中被調用時,this關鍵字是否指向子版本的ISBN?

這真的讓我感到困惑,我敢打賭,我寫它的方式表明了黑桃的困惑。

編輯:固定代碼錯誤與問題無關。

+0

你在那裏沒有一個構造函數。 – 2011-02-26 03:35:27

+0

它不是一個構造函數嗎? @kirk – Portaljacker 2011-02-26 03:38:06

+0

構造函數不能有返回類型。 – 2011-02-26 03:39:54

回答

3

您正處在正確的軌道上。你的問題的答案是肯定的,是的。

下面是完整的代碼將看起來像正確的語法

class Book { 
    String ISBN; 

    Book(String ISBN) { 
     this.ISBN = ISBN; 
    } 
} 

class KidsBook extends Book { 
    String kidsVariable; 
    KidsBook(String ISBN, String kidsVariable) { 
     super(ISBN); 
     this.kidsVariable = kidsVariable; 
    } 
} 
+0

謝謝@stack!我擔心這會涉及到它原來的類。 – Portaljacker 2011-02-26 03:35:52

+0

對於在子類中覆蓋的方法也是如此! – Miquel 2011-02-26 03:38:19

+0

OP在超類構造函數的上下文中詢問「this」引用的內容。正確的答案是,它指的是超類,而不是子類(子類),因此是字段「ISBN」的超類版本,而不是子類版本。 – 2011-02-26 03:44:11

0

什麼構造將是:

public KidsBook(ISBN isbn, Foo kidVariable) { 
    super(isbn); 
    this.kidVariable = kidVariable; 
}

現在,你在isbn參數傳遞從KidsBook的構造到它的超類的構造函數。該超類的構造是:

public Book(ISBN isbn) { 
    this.isbn = isbn; 
}

在端isbn實例變量(等效地,this.isbn)等於原始isbn傳遞到KidsBook構造。

0

這裏另一個例子,希望澄清一些java繼承的機制。

public class Book 
{ 
    protected String isbn; 

    public Book(String isbn) 
    { 
    this.isbn = isbn; 
    } 

    public Book() 
    { 
    // isbn not set 
    } 
} 

class DoubleIsbnBook extends Book 
{ 
    private String isbn; 

    public DoubleIsbnBook(String isbn) 
    { 
    super(); // could be commented out, since super class' constructor is implicitly called anyway 
    super.isbn = isbn; // since Book's isbn is protected, it's visible at this point 
    this.isbn = isbn.toUpperCase(); // here we set DoubleIsbnBook's isbn 
    } 

    public DoubleIsbnBook(String isbn1, String isbn2) { 
    super(isbn1); // if Book's isbn was private this would be the only way to set Book's isbn 
    this.isbn = isbn2; 
    } 
}