【问题标题】:Difference in constructor calling with different way of passing arguments使用不同的参数传递方式调用构造函数的差异
【发布时间】:2018-08-07 08:18:54
【问题描述】:

我正在处理构造函数,我通过了这个例子

public class Time2
{
    private int hour;
    private int minute;
    private int seconds;
    public Time2()
    {
        this(0, 0, 0)
    }
}

第二种方法是

public class Time2
{
    private int hour;
    private int minute;
    private int seconds;
    public Time2()
    {
    }
}

我没有在第二种方法中使用this(0,0,0)。以这种方式使用它们有什么区别?

如果我想在其中添加参数怎么办?

public Time2(int hour)
{
    this(hour, 0, 0);
}

为什么我们需要添加 null0 而不是不添加或根本不添加任何内容?

【问题讨论】:

  • 如果您没有 3 参数构造函数,则不会针对第一种情况编译代码。 this 使用给定数量的匹配参数调用另一个构造函数 - 因此您可以指定默认值
  • 所以第一个代码中的 this(0,0,0) 会找到一个有 3 个参数的构造函数?如果找不到怎么办?那么它会运行一个默认构造函数吗?
  • 不,它不会编译。

标签: java oop constructor


【解决方案1】:

您必须提供一个重载/参数化的构造函数才能在默认构造函数中使用它:

public class TimeTwo {
    private int hour;
    private int minute;
    private int seconds;

    public TimeTwo() {
        /*
         * the overloaded constructor is used here,
         * you have to write this(...) because
         * you want to initialize the current object
         */
        this(0, 0, 0);
    }

    public TimeTwo(int hour, int minute, int second) {
        this.hour = hour;
        this.minute = minute;
        this.seconds = second;
    }
}

另一种设置默认值的方法可以这样做:

public class TimeTwo {
    private int hour;
    private int minute;
    private int seconds;

    public TimeTwo() {
        this.hour = 0;
        this.minute = 0;
        this.seconds = 0;
    }
}

甚至还有第三种设置默认值的可能性:

public class TimeTwo {
    private int hour = 0;
    private int minute = 0;
    private int seconds = 0;

    public TimeTwo() {}
}

【讨论】:

  • 低于 'Time2(int hour, int minute, int second)' 是我的代码的一部分,但我主要关心的是为什么我需要编写 'Time2(){this(0,0,0 )}' 和为什么不写成 'Time2(){}' 有什么区别
  • 我认为没有必要写Time2() { this(0, 0, 0) },为什么你认为必须写?您也可以使用我的答案中显示的一种方式。请参阅第一类示例中的编辑(添加评论)。
【解决方案2】:
public Time2()
{
    this(0,0,0)
}

public Time2()
{
}

如果 Time2(int hour,int minute,int seconds) 构造函数仅将传递给它的值分配给 3 个实例变量(小时、分钟和秒),则将具有相同的行为,因为这些实例变量默认情况下将获得 0 值。

另一方面,如果Time2(int hour,int minute,int seconds) 构造函数包含一些额外的逻辑(例如计算某个其他实例变量的值),那么无参数构造函数的这两种实现会有不同的行为。

【讨论】:

  • 不同的行为可以作为默认构造函数运行吗?
  • @AHF 我不明白你的评论。从另一个构造函数调用一个构造函数通常是为了减少代码重复。因此,如果 3 参数构造函数包含所有构造函数都应该执行的一些逻辑,那么在无参数构造函数中调用 this(0,0,0) 可能是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2019-02-19
相关资源
最近更新 更多