为什么从参数化构造函数初始化实例变量需要默认构造函数调用?

时间:2017-01-27 08:16:36

标签: java constructor

我在代码中定义了两个构造函数

public SAPRoleImpl()
{
    dateParser=new SimpleDateFormat(MIDDAY_DATE_FORMAT);
    dateParser.setTimeZone(TimeZone.getTimeZone("GMT"));
    Calendar c=Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    c.set(Calendar.HOUR_OF_DAY,12);
    c.set(Calendar.MINUTE,0);
    c.set(Calendar.SECOND,0);
    c.set(Calendar.MILLISECOND,0);
    setStartDate(c.getTime());
}

public SAPRoleImpl(String formattedRole)
{
    this();
    ...
}

当我执行以下代码时:

public static void main(String[] args) {
    SAPRoleImpl sapRole = new SAPRoleImpl("abc|abcdesc||");
    System.out.println(sapRole);
}

它提供此输出

:abc|20170127||

这是预期的。但是当我只想要输出

abc|||

即没有开始日期初始化,我尝试了这段代码:

public SAPRoleImpl()
{
}

public SAPRoleImpl(String formattedRole)
{
    this();
    ...
}

这导致了NullPointerException。可能看起来startdate似乎是空的,但我无法理解背后的原因。

  

任何人都可以帮我理解吗?

1 个答案:

答案 0 :(得分:0)

显然,您有一个字段 startDate,只有在您调用方法setStartDate()时才会为其分配值。

如果省略在构造函数中调用该方法,那么该字段将保持为null。

最有可能的是,你在 null 字段上调用了一些方法,比如toString()。

顺便说一句:你的构造函数链接错误

通常的方法是你打电话给一个带更多参数的ctor,比如:

public public SAPRoleImpl() {
  this(SOME_DEFAULT_FORMAT_STRING);
}

public SAPRoleImpl(String format) {
  dateParser=new SimpleDateFormat(format);
  ...
  setStartDate(c.getTime());
}

换句话说:你绝对想把你的“真正的”初始化代码放在一个构造函数中;或者可能是一个init方法,如果没有其他方法,只是在多个构造函数中做一些稍微不同的事情。

相关问题