[英]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
在哪里初始化? 我無法在整個代碼庫中找到它。 那么為什么readCustomData
和writeCustomData
方法不會因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.