访问超类实例变量

时间:2015-08-26 14:29:14

标签: java

专家我需要一些帮助来理解我无法理解的内容。我正在创建一个超类和一个子类,我试图通过子类访问超类实例变量,但我总是得到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);
    }

}

3 个答案:

答案 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>,否则Boyname的{​​{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的实例,每个实例具有不同的名称。任何阅读此内容的人如果知道更多或知道我是否不正确,请编辑/评论任何更正。