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 函數中)。
添加回答
舉報