[英]Default Constructor in class file
如果我不提供任何構造函數,則編譯器將為該類創建一個默認構造函數。
該默認構造函數是否存在於類文件中?
如果不存在,那么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();
}
}
如您所見,沒有默認構造函數!
該默認構造函數會出現在類文件中嗎?
是的,它會的。
您可以通過創建一個具有默認構造函數的類,對其進行編譯,然后使用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]$
優質教育
在反編譯器的幫助下,我反編譯了類文件[並且輸出中沒有默認的構造函數]
有趣。 但是,這並不能證明1 。
實際發生的是反編譯器:
super();
等效super();
1--除了反編譯器有點聰明之外。
就是說,當Java將.java文件編譯為.class文件時,這就是Java要做的事情之一。 如果您沒有在浮子后面加上“ F”,或者在雙精度詞后面沒有“ D”,也會發生同樣的情況。
是的,它會的。 檢查以下答案,並編譯沒有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,因此默認構造函數為public。 如果為CoffeeCup授予了程序包訪問權限,則還將為默認構造函數提供程序包訪問權限。
鏈接: https : //www.artima.com/designtechniques/initializationP.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.