簡體   English   中英

誰在Java中提供默認構造函數? 編譯器還是JVM?

[英]Who provides the default constructor in Java? Compiler or JVM?

構造函數是在運行時還是編譯時添加的?(我想這是編譯時)。 在JVM架構級別,我需要一些深入的解釋。

我閱讀了各種文章..有些人說編譯器......還有其他人說JVM。 我想非常肯定(證明會有很多幫助)。

對不起,如果問題是愚蠢的(我還在消化術語)!

提前致謝。

來自Oracle的Java教程: https//docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

您不必為您的類提供任何構造函數,但在執行此操作時必須小心。 編譯器自動為沒有構造函數的任何類提供無參數的默認構造函數。 此默認構造函數將調用超類的無參數構造函數。 在這種情況下,如果超類沒有無參數構造函數,編譯器將會抱怨,因此您必須驗證它是否存在。 如果你的類沒有顯式的超類,那么它有一個隱式的超類Object,它有一個無參數的構造函數。

對於正式引用, 默認構造函數的性質在以下兩個中解釋:

或者,如果您使用的是Oracle JDK或OpenJDK,則可以輕松演示此行為,以驗證編譯器是否能夠完成所有魔術。

您需要做的就是使用JDK附帶的Java反編譯工具來查看類文件中生成的字節碼。

您應該在$JDK_HOME/bin/下看到一個名為javap的可執行文件

如果您有一個像Demo.java這樣的簡單文件Demo.java包含一個類,例如

public class Demo {}

然后使用命令javac Demo.java編譯它,然后使用javap -c Demo運行反編譯器,輸出應該是這樣的:

Compiled from "Demo.java"
public class Demo {
  public Demo();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
}

這表明它是添加默認構造函數的編譯器,因為它不在您的源代碼中,但它確實在您編譯的類文件中。

您還會注意到構造函數訪問級別與生成它的類的訪問級別相匹配。 所以,如果你這樣做

public class Demo { 
  protected static class Other {}
}

你編譯它,然后做一個javap -c Demo.Other你得到

public class Demo$Other {
  protected Demo$Other();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
}

再一次,證明編譯器添加了一個默認構造函數,該構造函數與生成它的類的可訪問性相匹配,如上面的規范所說的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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