繁体   English   中英

在Java中重载构造函数时

[英]When overloading constructors in Java

我想知道在Java中重载构造函数时是否需要初始化(调用)所有构造函数。

例如,

public class Dog {
  int size = 0;

  public Dog() {
    size = 20;
  }

  public Dog(int size) {
    this.size = size;
  }
}

编辑:

我知道,当用户调用不带任何参数的构造函数时,将调用public Dog()。 如果我不初始化一个类中的所有构造函数,会不会有编译错误?

当我创建Dog d = new Dog()时; 它将自动调用public Dog()。 但是,我还需要声明Dog d = new Dog(40)吗?

我认为如果需要初始化两个Dog构造函数都没有意义,但是我想知道其他示例中是否会出现问题。

我想知道是否需要在一个类中调用所有构造函数。

如果我不初始化一个类中的所有构造函数,会不会有编译错误?

没有。

您不必调用所有构造函数。 如果您编写构造函数或方法,然后不在应用程序中的任何位置使用它,则不会出现编译错误1

如果您不需要该类的任何实例,则甚至不必调用任何构造函数。 (并且在Java编码模式中,不需要实例化某个特定类……)。


1-但是,自动样式检查器/错误检查器或标记/检查代码的人员可能会注意到多余的构造函数和方法,并为此“ ping”您。

重载构造函数应采用这种方式: 它为您提供了一种从不同输入集中构造相同对象的方法。 这是关于构造函数的重要规则:

重载构造函数时,传递给每个构造函数的参数足以完全指定和构造目标对象(按其合同要求)很重要。

只要没有异常,调用构造函数总是返回一个对象。 您无法在已实例化的对象上调用第二个构造函数...,因为它已经被构造。

例如,考虑以下类:

public class Pair {

    private final int x
    private final int y

    public Pair() {
        this(0, 0);
    }

    public Pair(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public Pair(MyDoublet dbl) {
        this.x = dbl.getX();
        this.y = dbl.getY();
    }
    :
    :
}

有三个构造函数。 调用其中任何一个都会产生一个完全指定的Pair对象。 实际上,如果构造函数未完全指定Pair对象,则编译器将发出错误,因为对于Pair类,所有实例字段都是最终的,必须在构造函数中指定。

Pair p1 = new Pair();      // p1 has x=0, y=0
Pair p2 = new Pair(1, 3);  // p2 has x=1, y=3
Pair p3 = new Pair(0, 0);  // p3 is the same has p1 even though a
                           // different constructor was used.

TLDR:重载构造函数使您可以指定同一类中具有不同输入集的对象的构造。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM