我是一名试图破解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
一起以某种方式自动构建?或者我错过了一些东西,并且在代码库中有一些更深层次的魔术来初始化它?
答案 0 :(得分:12)
当Java类没有声明构造函数时,编译器会隐式添加一个无参数的构造函数,它只会调用超类无参数构造函数(如果没有这样的构造函数,则会出现编译器错误)。
但是,在您的示例中,字段m_Z
将为null。如果对这些方法的调用成功,则必须在其他位置设置该字段。毕竟这是公开的(非常糟糕的做法)。
答案 1 :(得分:0)
m_Z是公共的,因此可以在课外进行初始化:
Y y = new Y();
y.m_Z = new Z();
y.readCustomData(...);
可以正常工作。
可怕的代码。
答案 2 :(得分:0)
m_Z
变量为public
。外面的人有可能设置它吗?虽然这是一个非常糟糕的做法......
答案 3 :(得分:0)
如果没有构造函数,java会为您创建一个默认构造函数。所有成员都使用给定值进行初始化,如果没有给出值,则使用null
进行初始化。这意味着,如果您的成员m_Z
已设置,则它是从其他位置设置的(它是公共成员),因为默认构造函数已使用null初始化m_Z
;
答案 4 :(得分:0)
在给定的代码中,m_Z永远不会被初始化,所以它是null。但它可以从外部(公共)访问,因此值可以由y.m_Z = ...
设置。