簡體   English   中英

在子類中調用父方法將返回null值

[英]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 我試過的事情:

  1. 在子類中使用getName()而不是super.getName()
  2. 使用Parent p2 = new Parent(); 然后在子類中使用p2.getName()
  3. 使用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(); 它繼承父類Parentname屬性,其繼承的屬性name未設置且為null mainp1是一個完全不同的實例,其值不與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM