代码之家  ›  专栏  ›  技术社区  ›  AHF

用不同的参数传递方式调用构造函数的差异

  •  1
  • AHF  · 技术社区  · 8 年前

    我正在研究构造函数,我通过了这个例子

    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);
    }
    

    为什么我们需要添加 null 0 不是不加就什么都不加?

    2 回复  |  直到 8 年前
        1
  •  0
  •   Eran    8 年前
    public Time2()
    {
        this(0,0,0)
    }
    

    public Time2()
    {
    }
    

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

    另一方面,如果 时间2(整数小时、整数分钟、整数秒) 构造函数包含一些额外的逻辑(例如计算其他实例变量的值),这两个无参数构造函数的实现将具有不同的行为。

        2
  •  1
  •   deHaar    8 年前

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

    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() {}
    }