专家我需要一些帮助来理解我无法理解的内容。我正在创建一个超类和一个子类,我试图通过子类访问超类实例变量,但我总是得到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);
}
}
答案 0 :(得分:3)
您永远不会在name
个实例中为Boy
分配任何值,我添加了一些解释性注释:
// 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
。
答案 1 :(得分:0)
您正在引用name
的{{1}}实例,但它已在Boy
的实例中分配,因此它是Person
。
您可以通过添加:
来避免这种情况null
答案 2 :(得分:0)
从您的示例中,您似乎认为this
返回超类的实例,当它实际返回它所在类的实例时。在您的示例中,this
指的是您的Boy
类及其字段,当您希望它引用Person
时。除非您添加:{/ 1>,否则Boy
与name
的{{1}}不同
Person
我不是这方面的专家,但我相信你也可以用Boy boy = new Boy();
boy.name = person.name;
boy.info();
方法做到:
info()
如果你使用第二种方法,你可能需要在this.name = super.name;
System.out.println("Subclass Name " + this.name);
中使name
成为静态变量,但我不确定(如果有人知道请编辑/评论)。使用第一个可能更安全,因为那时您可以拥有多个Person
的实例,每个实例具有不同的名称。任何阅读此内容的人如果知道更多或知道我是否不正确,请编辑/评论任何更正。