簡體   English   中英

訪問超類實例變量

[英]Accessing super class instance variable

專家在這里,我需要一些幫助以了解我無法理解的內容。 我正在創建一個超類和一個子類,我試圖通過子類訪問超類實例變量,但是我總是得到null。 除非我為超類中的'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);
    }

}

您從未在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();

要設置name上你的Boy實例,調用printinfo你的Boy實例:

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   |
                 +-----------------+

請注意,Boy實例由其超類的字段(在本例中為Person )以及其自己的字段(但沒有任何字段)組成。

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

您是從Boy實例引用name ,但已在Person實例中分配名稱,因此它為null

您可以通過添加以下內容來消除該問題:

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

從你的榜樣,您似乎認為, this將返回您的超類,當它實際返回的類是在實例的實例。在您的例子, this是指你的Boy類及其字段,當你似乎想指Person 除非添加以下內容,否則BoyPerson name

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實例,每個實例使用不同的名稱。 對此內容有更多了解或知道我是否不正確的任何人,請編輯/評論任何更正。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM