簡體   English   中英

類文件中的默認構造函數

[英]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

實際發生的是反編譯器:

  • 看到.class文件中的no-args構造函數,其主體與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM