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

时间:2013-04-02 14:59:49

标签: java class constructor initializing

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

例如,这里所谓的(新b())??

public class a {
    public static void main(String args[]) {
        b classB = new b();
    }
}

public class b {
    public void aMethod() {
    }
}

5 个答案:

答案 0 :(得分:9)

在Java中没有“没有构造函数的类” - 如果源代码中没有显式构造函数,编译器会自动将默认值添加到类文件中:

public ClassName() {
  super();
}

如果超类本身没有公共或受保护的无参数构造函数,则反过来可能无法编译。

答案 1 :(得分:2)

它被称为默认构造函数。当类没有显式定义任何构造函数时,它会自动添加。

Formal specification

  

如果类不包含构造函数声明,则为默认值   不带参数的构造函数会自动提供:
  如果声明的类是原始类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中,我们使用类名以大写字母字符开头的约定。所以我已经为你改变了。