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