所以当一个类有一个私有构造函数时你不能初始化它,但是当它没有构造函数时你可以。那么当你在没有构造函数的情况下初始化一个类时会调用什么?
例如,这里叫什么 (new b())??
public class a {
public static void main(String args[]) {
b classB = new b();
}
}
public class b {
public void aMethod() {
}
}
所以当一个类有一个私有构造函数时你不能初始化它,但是当它没有构造函数时你可以。那么当你在没有构造函数的情况下初始化一个类时会调用什么?
例如,这里叫什么 (new b())??
public class a {
public static void main(String args[]) {
b classB = new b();
}
}
public class b {
public void aMethod() {
}
}
Java 中没有“没有构造函数的类”之类的东西——如果源代码中没有显式构造函数,编译器会自动将默认构造函数添加到类文件中:
public ClassName() {
super();
}
如果超类本身没有公共或受保护的无参数构造函数,则这反过来可能无法编译。
它被称为默认构造函数。当一个类没有明确定义任何构造函数时,它会自动添加。
正式规格:
如果类不包含构造函数声明,则自动提供不带参数的默认构造函数:
如果被声明的类是原始类 Object,则默认构造函数具有空主体。
否则,默认构造函数不带参数,只是简单地调用不带参数的超类构造函数。
调用默认的无参数构造函数 -有关更多信息,请参见此处
如有疑问,请使用javap
.
Empty.java
:
public class Empty {
public static void main(String[] args) {}
}
然后:
javac Empty.java
javap -v Empty.class
输出摘录:
public Empty();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
哈!生成了一个构造函数。如果我们尝试相同的:
public class Empty {
public Empty() {}
public static void main(String[] args) {}
}
我们看到完全相同的字节码。
我问过这是否是仅限 Java 的限制,或者它是否也存在于字节码级别:是否有一个没有任何构造函数的 JVM 字节码类有效?
有一个不可见的默认构造函数,看起来像这样:
public B() {
super();
}
当您调用 时new B()
,会调用此隐式构造函数。
请注意,在 Java 中,我们使用类名以大写字母字符开头的约定。所以我已经为你改变了。