5

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

例如,这里叫什么 (new b())??

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

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

5 回答 5

9

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

public ClassName() {
  super();
}

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

于 2013-04-02T15:01:02.387 回答
2

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

正式规格

如果类不包含构造函数声明,则自动提供不带参数的默认构造函数:
如果被声明的类是原始类 Object,则默认构造函数具有空主体。
否则,默认构造函数不带参数,只是简单地调用不带参数的超类构造函数。

于 2013-04-02T15:00:58.773 回答
2

调用默认的无参数构造函数 -有关更多信息,请参见此处

于 2013-04-02T15:01:12.997 回答
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 的限制,或者它是否也存在于字节码级别:是否有一个没有任何构造函数的 JVM 字节码类有效?

于 2015-04-06T10:33:29.500 回答
0

有一个不可见的默认构造函数,看起来像这样:

public B() {
   super();
}

当您调用 时new B(),会调用此隐式构造函数。

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

于 2013-04-02T15:01:59.537 回答