在没有构造函数的情况下初始化类时会调用什么?

因此,当一个类有一个私有构造函数时,你无法初始化它,但是当它没有构造函数时你就可以。 那么在没有构造函数的情况下初始化类时会调用什么?

例如,这里所谓的(新的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."":()V 4: return 

哈! 生成了一个构造函数。 如果我们尝试相同:

 public class Empty { public Empty() {} public static void main(String[] args) {} } 

我们看到完全相同的字节码。

我问过这是否只是Java限制,或者它是否也存在于字节码级别: 没有任何构造函数的JVM字节码类是否有效?

有一个看不见的默认构造函数,如下所示:

 public B() { super(); } 

当你调用new B() ,会调用这个隐式构造函数。

请注意,在Java中,我们使用类名以大写字母字符开头的约定。 所以我已经为你改变了。