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

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

從構造函數調用方法

從構造函數調用方法

皈依舞 2019-09-02 17:19:23
請原諒任何小的語法錯誤或諸如此類的錯誤,我正在通過Jitsi模塊遇到這個問題并且不熟悉Java,想要確認發生了什么以及為什么以及如何修復它。 public abstract class A{  public A()  {    this.load();  }  protected void load()  {  }}public class B extends A{  private String testString = null;   public B()  {    super();  }  @Override  protected void load()  {    testString = "test";  }}應用程序在使用按名稱加載類方法創建類B的實例時執行此操作:在B類中調用重寫的load()初始化變量(根據調試器調用“private string testString = null”),將它們清零。這是預期的Java行為嗎?什么可能導致這個?它是在1.7 JDK上運行的Java 1.6應用程序。
查看完整描述

2 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

這是預期的Java行為嗎?

是。

什么可能導致這個?

您在非final超類構造函數中調用非最終重寫方法。

讓我們一步一步看看會發生什么:

  • 您創建一個實例B。

  • B()調用超類構造函數 - A()來初始化超類成員。

  • A()現在調用一個在B類中重寫的非final方法,作為初始化的一部分。

  • 由于上下文中的實例是B類,因此load()調用的方法是B類。

  • load()初始化B類實例字段 - testString。

  • 超類構造函數完成作業,并返回(假設構造函數的鏈接Object已經完成)

  • B()構造函數開始執行進一步,初始化它自己的成員。

  • 現在,作為啟動過程的一部分,B覆蓋先前的寫入值testString,并將其重新初始化為null。

道德:永遠不要在其構造函數中調用非最終類的非最終公共方法。


查看完整回答
反對 回復 2019-09-02
  • 2 回答
  • 0 關注
  • 508 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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