[英]Calling a parent method in a child class returns a null value
我試圖通過使用父方法但在子類中顯示父類的變量值。
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());
}
}
我期待它輸出hi
但輸出為null
。 我試過的事情:
getName()
而不是super.getName()
。 Parent p2 = new Parent();
然后在子類中使用p2.getName()
。 protected String name;
在父類中。 這些似乎都不起作用; 所有這些仍然最終輸出null
。 救命?
您正在父對象中創建一個Child對象,並且您正在設置當前父對象的名稱字段,而不是子項的Parent,這意味着您創建了多個Parent對象 - 其名稱字段為正在設置,而另一個(子節點的父節點)的名稱字段從未設置,但已經過測試。
作為一個副作用,Parent類不應該做這種事情。 應該是孩子“不可知論者”。
當你寫:“孩子c1 =新孩子()”時,你正在創造一個全新的實例。 這個新實例的name
字段的值為null
:child的構造函數不在那里,因此你得到了默認的構造函數(它調用了父類構造函數而沒有其他內容)。 您的父類也沒有構造函數,因此它也不執行任何操作,這使您的name
字段的默認值為null
。
然后,您在此實例上調用input
方法。 由於此實例的實際類型是child
,因此將運行child
類中定義的input()
方法,該方法將輸出name
字段的值,該值為null
。
是的,有另一個實例(類型為parent
),其name
字段設置為“Hi”,但您沒有在該實例上調用input
方法。 您正在調用您在行child c1 = new child();
創建的實例的input
方法child c1 = new child();
。
當您執行Child c1 = new Child();
時,會創建一個新的和separte Child
對象Child c1 = new Child();
它繼承父類Parent
的name
屬性,其繼承的屬性name
未設置且為null
。 main
的p1
是一個完全不同的實例,其值不與c1
實例共享。
在子類中使用getName()而不是super.getName()。
這兩個都將導致null
因為name
是從父類Parent
繼承的,並且未初始化。 您在main
方法中初始化的Parent
對象是一個完全不同的實例,其屬性不會被input
方法中的child
實例引用。
使用父p2 = new Parent(); 然后在子類中使用p2.getName()。
您再次創建一個單獨的Parent
實例,因為您尚未初始化p2
實例的name
值, p2.getName()
將返回null。
使用受保護的String名稱; 在父類中。
protected
simple是一個訪問修飾符,它不會幫助您初始化從Parent
類繼承的name
屬性。
跟着我留下的評論,因為評論中的代碼格式非常有限。 因此,這里的主要問題是,孩子不只是需要有一個父。 孩子需要具有確切的期望對象作為父母。 通常這樣做的方法是通過構造函數。 所以我會讓子類看起來像這樣:
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();
}
只是為了給你另一個小樣本:
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());
}
}
在這個小樣本(基於您自己的樣本)中,您只創建一個父實例。 然后鍵入cast,將其作為Child鍵入c1變量。 所以當你調用input ()
時。 它使用Child類的實現,而不是父類。
它還假設您希望使用來自實際類之外的多態(例如,在本例中的main函數中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.