因此,当一个类有一个私有构造函数时,你无法初始化它,但是当它没有构造函数时你就可以。那么在没有构造函数的情况下初始化类时会调用什么?
例如,这里所谓的(新b())??
public class a {
public static void main(String args[]) {
b classB = new b();
}
}
public class b {
public void aMethod() {
}
}
答案 0 :(得分:9)
在Java中没有“没有构造函数的类” - 如果源代码中没有显式构造函数,编译器会自动将默认值添加到类文件中:
public ClassName() {
super();
}
如果超类本身没有公共或受保护的无参数构造函数,则反过来可能无法编译。
答案 1 :(得分:2)
它被称为默认构造函数。当类没有显式定义任何构造函数时,它会自动添加。
如果类不包含构造函数声明,则为默认值 不带参数的构造函数会自动提供:
如果声明的类是原始类Object,则默认值 构造函数有一个空体 否则,默认构造函数不带参数,只需调用 没有参数的超类构造函数。
答案 2 :(得分:2)
调用默认的无参数构造函数 - 有关详细信息,请参阅here
答案 3 :(得分:1)
如有疑问,请使用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的限制,或者它是否也出现在字节码级别:Is it valid to have a JVM bytecode class without any constructor?
答案 4 :(得分:0)
有一个看不见的默认构造函数:
public B() {
super();
}
当你调用new B()
时,会调用这个隐式构造函数。
注意,在Java中,我们使用类名以大写字母字符开头的约定。所以我已经为你改变了。