我试图通过使用父方法但在子类中显示父类的变量值.
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.我试过的事情:
getName()而不是super.getName()在子类中.Parent p2 = new Parent();然后p2.getName()在子类中.protected String name;在父类.这些似乎都不起作用; 所有这些仍然null最终输出.救命?
你要创建一个父对象中的子对象,而你设置当前父对象的名称字段,但不是在孩子的父母,这意味着你已经创建一个以上的父对象-一个名字字段正在设置,而另一个(子节点的父节点)的名称字段从未设置,但已经过测试.
作为一个副作用,Parent类不应该做这种事情.应该是孩子"不可知论者".
当您编写:“child c1 = new child()”时,您正在创建一个全新的实例。这个新实例的字段具有值null:name子类的构造函数不存在,因此您得到默认构造函数(它调用父类构造函数,仅调用父类构造函数)。您的父类也没有构造函数,因此它也不执行任何操作,这使您的name字段保留默认值null。
然后您可以在此实例上调用该input方法。因为该实例的实际类型是child,所以类input()中定义的方法child会运行,该方法会打印该字段的值name,即null。
是的,还有另一个实例(类型为parent),其name字段设置为“Hi”,但您没有input在该实例上调用该方法。您正在调用input在 line 中创建的实例的方法child c1 = new child();。