如果我不提供任何构造函数,编译器将为该类创建一个默认构造函数。
类文件中是否存在默认构造函数?
如果它不存在那么VM如何运行类文件并为类创建对象?
更新1:
我创建了一个类文件,
public class ConstructorExp {
public static void main(String[] args){
ConstructorExp e = new ConstructorExp();
}
}
在反编译器的帮助下,我反编译了类文件
/*
* Decompiled with CFR 0_114.
*/
public class ConstructorExp {
public static void main(String[] arrstring) {
ConstructorExp constructorExp = new ConstructorExp();
}
}
如您所见,没有默认构造函数!
答案 0 :(得分:3)
类文件中是否存在默认构造函数?
是的。
您可以通过创建一个具有默认构造函数的类,编译它然后使用JDK附带的javap
实用程序来检查它来自行检查。
这是我做的时候会发生什么。
[stephen@blackbox tmp]$ cat Test.java
public class Test {}
[stephen@blackbox tmp]$ javac Test.java
[stephen@blackbox tmp]$ javap -c Test
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
}
[stephen@blackbox tmp]$
QED
在反编译器的帮助下,我反编译了类文件[并且输出中没有默认构造函数]
有趣。但是,这并没有证明 1 。
实际发生的是反编译器:
super();
1 - ...除了反编译器有点聪明之外。
答案 1 :(得分:0)
当它将.java文件编译为.class文件时,这就是java所做的事情之一。同样的情况发生,如果你没有放置&#34; F&#34;在一个花车后面,或者一个&#34; D&#34;落后一双。
答案 2 :(得分:0)
是的,它会。检查下面的答案并编译一个没有arg构造函数的类a。你会找到答案。无论如何解释如下
默认构造函数 如果声明一个没有构造函数的类,编译器将自动为该类创建一个默认构造函数。默认构造函数不带参数(它是一个无参数构造函数)并且有一个空体。因为如果您没有显式声明任何构造函数,编译器将自动生成默认构造函数,所有类都保证至少有一个构造函数。例如,如果声明一个CoffeeCup类而未明确声明构造函数:
//在文件init / ex6 / CoffeeCup.java中的源包中
class CoffeeCup {
private int innerCoffee;
public void add(int amount) {
innerCoffee += amount;
}
//...
}
编译器将生成相同的类文件,就像您已显式声明一个空体的无参数构造函数一样:
//文件init / ex7 / CoffeeCup.java中的源数据包
class CoffeeCup {
private int innerCoffee;
public CoffeeCup() {
}
public void add(int amount) {
innerCoffee += amount;
}
//...
}
编译器为默认构造函数提供与其类相同的访问级别。在上面的示例中,类CoffeeCup是公共的,因此默认构造函数是public。如果CoffeeCup已获得包访问权限,则默认构造函数也将获得包访问权。
链接:https://www.artima.com/designtechniques/initializationP.html