亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

函數式編程 2022-06-23 15:52:22
我試圖通過使用父方法但在子類中顯示父類中的變量的值。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。幫助?
查看完整描述

5 回答

?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

您在 Parent 對象中創建了一個 Child 對象,并且您正在設置當前父對象的 name 字段,而不是Child 的 Parent,這意味著您創建了多個 Parent 對象——其 name 字段為被設置,另一個(孩子的父母)的名字字段從未被設置,但被測試了。

順便說一句,父類不應該做這種事情。它應該是兒童“不可知論者”。


查看完整回答
反對 回復 2022-06-23
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

當您編寫:“child c1 = new child()”時,您正在創建一個全新的實例。這個新實例nullname字段具有值: child 的構造函數不存在,因此您獲得了默認構造函數(它調用父類構造函數,僅此而已)。您的父類也沒有構造函數,因此它也不做任何事情,這使您的name字段保持其默認值null.

input然后,您在此實例上調用該方法。因為這個實例的實際類型是child,所以input()在你的類中定義的方法child運行,它會打印name字段的值,即null。

是的,有另一個實例(類型為parent),它的name字段設置為“Hi”,但您沒有input在該實例上調用該方法。您正在調用input您在 line 中創建的實例的方法child c1 = new child();。


查看完整回答
反對 回復 2022-06-23
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

Child當您這樣做時,會創建一個新的和單獨的對象Child c1 = new Child();,該對象name從父類Parent繼承屬性,其繼承的屬性name未設置并且是null。p1in the是main一個完全不同的實例,其值不與c1實例共享。

在子類中使用 getName() 而不是 super.getName()。

這兩者都將導致從父nullname繼承Parent并且未初始化。Parent您在方法中初始化的對象main是一個完全不同的實例,其屬性未被方法child中的實例引用input。

使用父 p2 = new Parent(); 然后是子類中的 p2.getName() 。

同樣,您正在創建一個單獨的實例,Parent并且由于您尚未初始化該實例的name值,因此將返回 null。p2p2.getName()

使用受保護的字符串名稱;在父類中。

protected只是一個訪問修飾符,它不會幫助您初始化name從類繼承的屬性Parent。

這是視覺上的:

http://img1.sycdn.imooc.com//62b41bdf0001397c05460484.jpg

查看完整回答
反對 回復 2022-06-23
?
隔江千里

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();

}


查看完整回答
反對 回復 2022-06-23
?
德瑪西亞99

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 函數中)。


查看完整回答
反對 回復 2022-06-23
  • 5 回答
  • 0 關注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號