在没有构造函数的情况下初始化类时会调用什么?
因此,当一个类有一个私有构造函数时,你无法初始化它,但是当它没有构造函数时你就可以。 那么在没有构造函数的情况下初始化类时会调用什么?
例如,这里所谓的(新的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中,我们使用类名以大写字母字符开头的约定。 所以我已经为你改变了。