簡體   English   中英

object.super() 有什么作用? 如何創建一個國家?

[英]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 objectAbstractState構造函數調用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.

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