簡體   English   中英

Java中的構造函數是可選的還是什么?

[英]Are constructors optional in Java or what?

我是一個試圖破解Java項目的C#程序員。 這是我們的生產代碼中的匿名摘錄。 它有效(我認為)。 請注意,這整個班級。

public class Y extends X
{
  public Z m_Z;

  protected void readCustomData (CustomStream reader, boolean forUpdate)
    throws IOException, FTGException
  {
    super.readCustomData (reader, forUpdate) ;
    m_Z.readBinaryData (reader, forUpdate) ;
  }

  protected void writeCustomData (CustomStream writer, int original)
    throws IOException, FTGException
  {
    super.writeCustomData (writer, original) ;
    m_Z.writeBinaryData (writer, original) ;
  }
}

令我困惑的是 - m_Z在哪里初始化? 我無法在整個代碼庫中找到它。 那么為什么readCustomDatawriteCustomData方法不會因NullReferenceException而失敗 - 或者Java中的等價物是什么? m_Z是否與Y一起自動構建? 或者我錯過了什么,在代碼庫中有一些更深層次的魔術來初始化它?

當Java類沒有聲明構造函數時,編譯器會隱式添加一個無參數的構造函數,除了調用超類無參數構造函數之外什么也不做(如果沒有這樣的構造函數,則會出現編譯器錯誤)。

但是,在您的示例中,字段m_Z將為null。 如果對這些方法的調用成功,則必須在其他位置設置該字段。 畢竟這是公開的(非常糟糕的做法)。

m_Z是公共的,因此可以在類外初始化:

Y y = new Y();
y.m_Z = new Z();
y.readCustomData(...);

會工作好嗎。

雖然可怕的代碼。

m_Z變量是public 外面的人有可能設置它嗎? 雖然這是一個非常糟糕的做法......

如果沒有構造函數,java會為您創建一個默認構造函數。 所有成員都使用給定值初始化,如果沒有給出值,則使用null初始化。 這意味着,如果您的成員m_Z已設置,則它是從其他位置設置的(它是公共成員),因為默認構造函數已使用null初始化m_Z ;

在給定的代碼中,m_Z永遠不會被初始化,所以它是null。 但它可以從外部(公共)訪問,因此可以通過y.m_Z = ...設置該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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