2015-08-26 204 views
0

專家我需要一些幫助來理解我無法理解的內容。我創建一個超類和一個子類,我試圖通過子類訪問超類實例變量,但我總是得到空。除非我明確地將值分配給超類中的'name'變量。訪問超類實例變量

package example1; 

public class InterfaceExample { 
    public static void main(String[] args) { 
     Person person = new Person(); 
     person.printinfo("WOLFSKIN", "Test Address"); 
     Boy boy = new Boy(); 
     boy.info(); 
    } 
} 

class Person { 
    String name; 
    String address; 

    public void printinfo(String name, String address) { 
     this.name = name; 
     this.address = address; 
     System.out.println("Name: " + name + '\n' + "Address: " + address); 
    } 
} 

class Boy extends Person { 
    public void info() { 
     System.out.println("Subclass Name " + this.name); 
    } 

} 
+0

你不明白什麼?您沒有爲該名稱聲明任何值,所以它返回空值是正常的... – realUser404

+0

您沒有爲'boy.name'字段設置任何值,因此它爲空。 「人」和「男孩」實例完全不相關,彼此不瞭解。 –

+0

我從下面的答案(T.J.Crowder)得到它,我假設子類的實例也會繼承超類實例(實例值)。 – WolfSkin

回答

3

你從來沒有在您的Boy實例分配給name任何價值,我已經添加了一些解釋性評論:

// Creates a Person (not a Boy) 
Person person = new Person(); 

// Sets the name on that Person 
person.printinfo("WOLFSKIN", "Test Address"); 

// Creates an *entirely separate object*, an instance of Boy 
Boy boy = new Boy(); 

// Accesses `name`, which has never been set 
boy.info(); 

要在Boy例如設置nameBoy實例,調用printinfo

boy.printinfo("WOLFSKIN", "Test Address"); 

讓我們拋出一些ASCII藝術吧:

Person person = new Person(); 

給我們:

 
+-----------+  +-----------------+ 
| person |---->| Person instance | 
+-----------+  +-----------------+ 
        | name: null  | 
+-----------+  | address: null | 
| boy: null |  +-----------------+ 
+-----------+ 

再經過:

person.printinfo("WOLFSKIN", "Test Address"); 

我們:

 
+--------+  +-----------------+ +-----------------+ 
| person |------>| Person instance | | String instance | 
+--------+  +-----------------+ +-----------------+ 
       | name   |--->| "WOLFSKIN"  | 
       | address   |-+ +-----------------+ 
       +-----------------+ | 
+-----------+      | +-----------------+ 
| boy: null |      | | String instance | 
+-----------+      | +-----------------+ 
            +->| "Test Address" | 
             +-----------------+ 

現在我們做的事:

Boy boy = new Boy(); 

而得到這樣的:

 
+--------+  +-----------------+ +-----------------+ 
| person |------>| Person instance | | String instance | 
+--------+  +-----------------+ +-----------------+ 
       | name   |--->| "WOLFSKIN"  | 
       | address   |-+ +-----------------+ 
       +-----------------+ | 
+-----------+      | +-----------------+ 
| boy  |-+      | | String instance | 
+-----------+ |      | +-----------------+ 
       |      +->| "Test Address" | 
       |       +-----------------+ 
       | +-----------------+ 
       +->| Boy instance | 
       +-----------------+ 
       | name: null  | 
       | address: null | 
       +-----------------+ 

注意的是,男孩的實例是由它的超類的字段(Person,在這種情況下),以及其自己的字段(但它不具有任何)。

由於您從未填寫boyname的值,因此它仍具有默認值null

+1

謝謝。這是一個愚蠢的混亂。非常感謝 – WolfSkin

0

您從Boy一個實例引用name,但它在Person一個實例被分配,因此它的null

可以消除通過添加:

boy.printinfo("WOLFSKIN", "Test Address"); 
0

從你的榜樣,您似乎認爲,this回報你的超類,當它實際返回的類是在該實例的實例中。你的例子,this指的是你的Boy類和它的領域,當你似乎希望它指的是PersonBoy不具有相同的name作爲Person除非添加:

Boy boy = new Boy(); 
boy.name = person.name; 
boy.info(); 

我不是這方面的專家,但我相信你也可以做,在你info()方法:

this.name = super.name; 
System.out.println("Subclass Name " + this.name); 

您可能如果使用第二種方法,需要在Person中製作name靜態變量,但我不確定(如果有人知道請編輯/評論)。使用第一個可能更安全,因爲可以有多個名稱不同的Boy實例。任何閱讀本文的人士如果知道更多信息或知道我是否有任何不正確之處,請編輯/評論任何更正。