5 回答

TA贡献1851条经验 获得超4个赞
您在 Parent 对象中创建了一个 Child 对象,并且您正在设置当前父对象的 name 字段,而不是Child 的 Parent,这意味着您创建了多个 Parent 对象——其 name 字段为被设置,另一个(孩子的父母)的名字字段从未被设置,但被测试了。
顺便说一句,父类不应该做这种事情。它应该是儿童“不可知论者”。

TA贡献1803条经验 获得超3个赞
当您编写:“child c1 = new child()”时,您正在创建一个全新的实例。这个新实例null
的name
字段具有值: child 的构造函数不存在,因此您获得了默认构造函数(它调用父类构造函数,仅此而已)。您的父类也没有构造函数,因此它也不做任何事情,这使您的name
字段保持其默认值null
.
input
然后,您在此实例上调用该方法。因为这个实例的实际类型是child
,所以input()
在你的类中定义的方法child
运行,它会打印name
字段的值,即null
。
是的,有另一个实例(类型为parent
),它的name
字段设置为“Hi”,但您没有input
在该实例上调用该方法。您正在调用input
您在 line 中创建的实例的方法child c1 = new child();
。

TA贡献1836条经验 获得超4个赞
Child
当您这样做时,会创建一个新的和单独的对象Child c1 = new Child();
,该对象name
从父类Parent
继承属性,其继承的属性name
未设置并且是null
。p1
in the是main
一个完全不同的实例,其值不与c1
实例共享。
在子类中使用 getName() 而不是 super.getName()。
这两者都将导致从父null
类name
继承Parent
并且未初始化。Parent
您在方法中初始化的对象main
是一个完全不同的实例,其属性未被方法child
中的实例引用input
。
使用父 p2 = new Parent(); 然后是子类中的 p2.getName() 。
同样,您正在创建一个单独的实例,Parent
并且由于您尚未初始化该实例的name
值,因此将返回 null。p2
p2.getName()
使用受保护的字符串名称;在父类中。
protected
只是一个访问修饰符,它不会帮助您初始化name
从类继承的属性Parent
。
这是视觉上的:

TA贡献1906条经验 获得超10个赞
跟进我留下的评论,因为评论中的代码格式非常有限。所以这里的主要问题是孩子不仅仅需要有父母。孩子需要有确切的所需对象作为父母。这通常是通过构造函数完成的。所以我会让子类看起来像这样:
class Child extends Parent {
private Parent parent;
public Child(Parent parent) {
this.parent = parent;
}
public void input() {
System.out.print(parent.getName());
}
}
然后,在您的父类中,您将拥有:
public void input() {
String q = "hi";
setName(q);
Child c1 = new Child(this);
c1.input();
}

TA贡献1770条经验 获得超3个赞
只是给你另一个小样本:
public class main {
public static void main(String[] args) {
Parent p1 = new Parent();
p1.input();
Child c1 = (Child)P1; //this is a type cast, which is possible due to what is known as polymorphism
c1.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);
}
}
class Child extends Parent {
public void input() {
System.out.print(super.getName());
}
}
在这个小示例(基于您自己的)中,您只创建了一个父级实例。然后你将它作为 Child 输入到 c1 变量中。所以当你调用input ()它时。它使用子类的实现,而不是父类的实现。
它还假设您希望在实际类之外使用多态性(例如,在这种情况下,在 main 函数中)。
添加回答
举报