[英]What does object.super() do? How to creating a State?
所以我有這個代碼:
public class A {
private State _state;
public abstract class State {
protected void setState(State newState) {
_state = newState;
}
}
public A() {
_state = new AbstractState(this);
}
}
public abstract class AbstractState extends A.State {
AbstractState(A a) {
a.super();
}
}
我很難理解它是如何工作的。
因此,當創建A object
時,它會創建一個具有相同A object
作為參數的AbstractState
對象。 而接收A object
的AbstractState
構造函數調用a.super()
。
根據我的理解, a.super()
調用了A a
的超類的a.super()
,也就是Object
,對吧? 那么有什么意義呢?
我知道AbstractState
是一個抽象類。 一個子類可以是:
public class StateOne extends AbstractState {
StateOne(A a) {
super(a);
}
}
問題仍然存在。
根據我的理解,
a.super()
調用A a的超類的構造函數,這是Object,對嗎? 那有什么意義呢?
我認為您是在問為什么必須編寫a.super()
而不是super()
。
首先,它不調用的構造A
或超類的A
。 構造函數中的super(...)
調用始終表示您要實例化的類的直接超類中的構造函數。 在這種情況下,超類是內部類A.State
。
什么a.super()
實際上說的是“叫我超類的構造函數有a
作為我的外圍實例 ”。
因為超類是一個內部類,所以需要特殊的語法,並且在實例化一個內部類時,它需要知道內部包含哪個封閉類的實例 。
在您的示例中, State
被聲明為內部類(即,不是static
),因此setState
方法可以在封閉類( A
)中看到某個實例的private _state
變量。 a.super()
是必需的,以便JVM可以知道A
哪個實例是封閉的實例 。
要調用內部類(State),它必須先告訴它誰是它的超類 A。 JVM 可以找到 StateOne 的父類,只需使用“ extends A.State ”這個語句。
a.super() 對應A.State
a --> “ extends A.State ”中的A,告訴內部類誰是你的父類(父類的實例) super() ----> “extends A.State”中的State,它是內部類
你可以這樣理解,一個普通的類擴展使用“super()/super(xx)”,但是擴展內部類必須首先知道它的超類的一個實例。 那么如何知道它的超類,在構造函數中,使用參數。 然后,使用super()調用父親的構造函數,像這樣,內部類使用(我父親的類).super()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.