在子类中调用父方法将返回null值

Eev*_*ver 6 java inheritance

我试图通过使用父方法但在子类中显示父类的变量值.

public class A {
    public static void main(String[] args) {
        Parent p1 = new Parent();
        p1.input();
    }
}
class Parent {
    private String name;
    public void setName(String newName) {
        name = newName;
    }
    public String getName() {
        return name;
    }
    public void input() {
        String q = "hi";
        setName(q);
        Child c1 = new Child();
        c1.input();
    }
}
class Child extends Parent {
    public void input() {
        System.out.print(super.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待它输出,hi但输出是null.我试过的事情:

  1. 使用getName()而不是super.getName()在子类中.
  2. 使用Parent p2 = new Parent();然后p2.getName()在子类中.
  3. 使用protected String name;在父类.

这些似乎都不起作用; 所有这些仍然null最终输出.救命?

Hov*_*els 6

你要创建一个父对象中的子对象,而你设置当前父对象的名称字段,但不是在孩子的父母,这意味着你已经创建一个以上的父对象-一个名字字段正在设置,而另一个(子节点的父节点)的名称字段从未设置,但已经过测试.

作为一个副作用,Parent类不应该做这种事情.应该是孩子"不可知论者".


rzw*_*oot 3

当您编写:“child c1 = new child()”时,您正在创建一个全新的实例。这个新实例的字段具有值nullname子类的构造函数不存在,因此您得到默认构造函数(它调用父类构造函数,仅调用父类构造函数)。您的父类也没有构造函数,因此它也不执行任何操作,这使您的name字段保留默认值null

然后您可以在此实例上调用该input方法。因为该实例的实际类型是child,所以类input()中定义的方法child会运行,该方法会打印该字段的值name,即null

是的,还有另一个实例(类型为parent),其name字段设置为“Hi”,但您没有input在该实例上调用该方法。您正在调用input在 line 中创建的实例的方法child c1 = new child();