![](/img/trans.png)
[英]accessing the private memeber variable of super class in the child class through reflection
[英]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
。 除非添加以下內容,否則Boy
與Person
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.