[英]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.