當程式員無法將任何建構式寫入類時,編譯器會提供默認建構式。據說這些建構式是用來初始化類屬性的默認值的。 但是如果程式員提供了一個建構式,就簡單的像這樣:
public class Main {
int a;
Main() { // user defined simple constructor
System.out.println("hello");
}
public static main(String[] args) {
Main obj = new Main();
}
}
在上面的代碼中,用戶已經包含了一個建構式。但是它不會初始化實體變數(a)。此外,不會呼叫默認建構式。那么變數 'a' 怎么會被初始化為它的默認值。
如果是這樣,默認建構式不會將類變數初始化為其默認值而編譯器會自動初始化,那么默認建構式的實際用途是什么?
為什么編譯器會在用戶撰寫建構式失敗的情況下添加默認建構式?
uj5u.com熱心網友回復:
那么變數 'a' 怎么會被初始化為它的默認值。
因為語言指定欄位被初始化為其默認值。具體來說,JLS 4.12.5:
程式中的每個變數在使用其值之前都必須有一個值:
- 每個類變數、實體變數或陣列組件在創建時都使用默認值進行初始化(第 15.9 節、第 15.10.2 節):
- ...
- 對于 int 型別,默認值為 0,即 0。
- ...
即使您確實在建構式中對其進行了初始化,您也可以事先讀取該欄位,并觀察其默認值。例如:
Main() { // user defined simple constructor
System.out.println(a); // Prints 0
a = 1;
}
雖然它在 Java 中new Main()對你來說大部分是隱藏的,但它做了兩件事(有關更多詳細資訊,請參閱JLS 15.9.4,因為它實際上不止兩件事):
- 它創建了一個實體
Main - 然后它呼叫建構式以初始化該實體。
將欄位初始化為其默認值實際上是在創建實體時發生的(第一步,如上面 JLS 參考中所述);因此,即使呼叫建構式的第二步沒有發生,欄位仍然被初始化為它們的默認值。
為什么編譯器會在用戶撰寫建構式失敗的情況下添加默認建構式?
因為否則您將無法創建該類的實體。
此外,默認建構式(就像所有不在this(...)第一行呼叫的建構式一樣)呼叫超級建構式。所以,它看起來像:
Main() {
super();
}
您必須呼叫類的超級建構式才能對基類進行必要的初始化。
uj5u.com熱心網友回復:
默認值
據說這些建構式用于初始化類屬性的默認值。
那是不正確的。施工人員(包括默認的無引數的建構式)并沒有初始化的欄位為默認值。這是由語言預先隱式完成的(參見 JLS 定義)。
默認建構式與完全空的建構式相同:
Foo() {}
從技術上講,像其他建構式一樣, this 隱式地仍然包含對父類建構式的呼叫:
Foo() {
super();
}
也看看位元組碼public class Foo {},它是:
public class Foo {
public Foo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
}
您可以清楚地看到帶有呼叫Objects 構造函式的代碼的默認構造函式。
為什么要在位元組碼中添加它?
為什么編譯器會在用戶撰寫建構式失敗的情況下添加默認建構式?
從理論上講,它不必這樣做。然而,在語言設計方面,添加它以簡化語言的其余部分要容易得多。
例如,那么您不需要任何魔法就可以new Foo();作業,因為建構式實際上存在于 JVM 執行的代碼中。
這同樣適用于更高級的主題,例如反射 API,其方法類似于
Object foo = Foo.class.getConstructor().newInstance();
因此,如果建構式只是實際存在于位元組碼中,那么您在 JVM 中不需要任何魔法來完成這項作業。它開箱即用。
歸根結底,開發人員的設計決定是按照他們的方式創建它。他們也可以以不同的方式意識到這一點。
但是,通過這種方式,Java 和 JVM 位元組碼作為語言之間的劃分更加清晰。從技術上講,您還可以在位元組碼中創建甚至根本沒有建構式的類(您無法在 Java 中創建),這對編譯為 JVM 位元組碼的特殊工具和其他語言(Kotlin、Groovy、Scala、Clojure)很有趣,……)。
uj5u.com熱心網友回復:
欄位初始化為默認值(0、0.0、null、false 等...)
uj5u.com熱心網友回復:
默認行為很有用。如果它沒有被使用或將它放在另一個類中,或者將其設定為 null,則替代方法可能是將其洗掉。但大多數時候,您確實需要默認行為。我相信這就是總體思路。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/377766.html
