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

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

你能分析一下關于繼承的JAVA代碼的輸出嗎

你能分析一下關于繼承的JAVA代碼的輸出嗎

素胚勾勒不出你 2023-03-17 15:19:49
我在代碼的注釋中添加了我的問題。class Parent{    int num =9; //I think num in Parent class is overrided by the num in Child class. why is the num in the first line of output is still 9?    { //code block        System.out.println("Parent constructor code..."+num);    }    Parent(){        System.out.println("Parent constructor run");         show(); //why does this method here invoke the show() method in Child class?    }    void show() {        System.out.println("Parent show..."+num);    }}class Child extends Parent{    int num = 8;     {        System.out.println("Child constructor code..."+num);        num = 10;    }    Child(){         System.out.println("Child constructor run");         show();     }    void show() {        System.out.println("Child show..."+num);    }}public class Test {    public static void main(String[] args) {        new Child();    }}輸出是:父構造函數代碼...9父構造函數運行子顯示...0子構造函數代碼...8子構造函數運行子顯示...10感謝你們!我發現這是一個可變的陰影和隱藏問題。
查看完整描述

3 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

對象構建的順序是:

  1. 變量聲明和初始化

  2. 實例構造函數塊

  3. constructor

如果一個類有父類,則在實際類之前先為父類完成相同的順序。

父母第一

整數 = 9

首先評估,num設置為 9(父母的 1)

父構造函數代碼...9

實例初始化塊在構造函數(父類的 2.)之前執行

父構造函數運行

構造函數被調用(parent's 3.)

兒童節目...0

Parent調用的構造函數show()。show()被覆蓋,因此Child調用了。

孩子的 1. 和 2. 還沒有被調用,因此 overriding numinChild仍然是 0。*1

然后孩子

整數 = 8

Child1. 被評估

子構造函數代碼...8

Child的 2.num在此之后設置為 10。

子構造函數運行

Child的 3。

兒童節目...10

Child的構造函數調用show()

*1:

這就是為什么final在構造函數中調用非方法是非常危險的。方法往往依賴于被初始化的成員變量;他們不是在這一點上。

NullPointerException如果這是一個非原始變量,如果您的方法試圖訪問它,您很可能會遇到 a 。


查看完整回答
反對 回復 2023-03-17
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

當 java 創建一個子類時,它必須調用super()初始化父類——這樣它就可以在超類或其他活動中實例化私有字段。(這不會創建父類的對象。)這就是您看到的原因Parent constructor code...9- 它正在調用父代碼,并打印父類的num.

因為您創建了一個子類,所以在父構造函數中show()調用了子類。這就是為什么在構造函數中調用非 final 方法是危險的——如果子對象覆蓋了它們,則將調用子對象的方法。

孩子的num是 0 因為Java 將成員變量初始化為默認值,而您的代碼還沒有機會將其設置為 10。

至于你的子代碼,num沒有被覆蓋,它被隱藏了——只有方法可以被覆蓋。這就是為什么您的孩子show()在正確初始化后將其顯示為 10 的原因。如果你想訪問父變量,你可以用 來實現super.num,但這通常被認為是不好的做法,因為它會引起混淆。


查看完整回答
反對 回復 2023-03-17
?
慕萊塢森

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

我認為這是因為你的構造函數自動調用超類構造函數。(對于我們的第一個問題。)盡管如此,你重寫了 show 所以當它遇到這個方法時,它調用子方法



查看完整回答
反對 回復 2023-03-17
  • 3 回答
  • 0 關注
  • 266 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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