2010-09-28 91 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 = ...来设置。

相关问题