這裏一般是Java和OOP的新手。對象創建流程如何在Java中工作?
我想了解什麼時候可以使用對象的成員。具體來說,爲什麼我不能在類中調用實例變量時將構造函數傳遞給構造函數?下面的代碼示例如下:
public class Point {
public String name;
{
name = "Henry";
}
public Point()
{
this(this.name); // cannot reference this before supertype constructor has been called
}
public Point(String name)
{
this.name = name;
}
}
之前有人問過這樣的問題,但我不知道如何向Google詢問我在這裏解釋的內容。我知道我不能在this(this.name)
調用中引用this.name
,因爲尚未創建對象引用,但Java如何調用構造函數?
該構造函數將要執行的唯一時間是用new Point()
當創建一個對象,而此時的對象引用將可用,編譯器不會有什麼可抱怨的。如果有可能將this.name
分配給一個變量,然後將其傳遞給this(variable)
,它會起作用嗎?什麼是巨大的差異?我在這裏完全誤解了一些東西。
這是我如何可視化它,這顯然是不正確的:
Point myPoint = new Point();
myPoint.name
現在等於"Henry"
的Point()
構造函數中,執行this(this.name) // which should be "Henry"
無聊的細節應該主要在https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html(在你的情況下,如果超類聲明瞭,會發生什麼字段,並希望將其設置在它的構造函數中?這就是爲什麼超級必須運行之前,你可以使用任何東西) – zapl
當你做'新的Point()',那就像'new'是一個方法,返回一個引用'在堆上構建的Point對象(引擎蓋下只是一些內存,它包含所有實例變量/引用/ ... https://dzone.com/articles/java-object-memory)。它不會首先創建一個「對象」。它直接是一個「點」。但是'Point'是一個Object(通過繼承),所以'Object'構造函數將會發現它所期望的。因此,當你「延長」時你不能拿走。 – zapl