2010-09-28 98 views
2

我是一個試圖破解Java項目的C#程序員。以下是我們的產品代碼的匿名摘錄。它工作(我認爲)。請注意,這個是全班的Java中的構造函數是可選的還是什麼?

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一起自動構建?或者我錯過了什麼,並且在初始化它的代碼庫中有一些更深的魔力?

+0

你使用什麼樣的IDE?在eclipse中,例如,您可以在工作區中搜索引用,並標記該字段並按下strg + shift + g。大多數IDE都有類似的東西。這樣,你應該找到你討厭的消毒器! ;) – crusam 2010-09-28 11:19:55

+0

Netbeans。我已經通過參考和簡單的字符串搜索它。但我已經發現反射被用來初始化它,所以它沒有被發現。 – 2010-09-28 12:38:53

回答

12

當Java類沒有聲明構造函數時,編譯器會隱式添加一個無參數構造函數,該函數除了調用超類無參數構造函數(如果沒有這種構造函數,將會出現編譯器錯誤)。

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

+2

打敗我吧,關於公共領域的重要一點。談談代碼味道。 – I82Much 2010-09-28 10:39:56

+0

代碼味道毫無疑問,但除此之外。我們只是說這是該項目中最少的代碼異味。 :)無論如何,謝謝澄清。我會繼續我的追捕。 – 2010-09-28 10:43:17

+0

我不記得我最後一次使用公共變量。也許從不。 – 2010-09-28 11:58:47

0

m_Z是公開的,所以它可以在類的外部被初始化:

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

會工作確定。

雖然可怕的代碼。

0

m_Z變量是public。外面的人有沒有機會設置它?雖然這是一個非常糟糕的做法...

0

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

0

在給定的代碼m_Z從未初始化,所以它是空的。但它可以從outrside(公共)訪問,所以值可以由y.m_Z = ...來設置。

相關問題