Java中的构造函数是可选的还是什么?

时间:2010-09-28 10:35:29

标签: java constructor

我是一名试图破解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一起以某种方式自动构建?或者我错过了一些东西,并且在代码库中有一些更深层次的魔术来初始化它?

5 个答案:

答案 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 = ...设置。