簡體   English   中英

Java覆蓋方法無法識別在super中定義的變量

[英]Java overriding method does not recognize variable defined in super

使用Java(對於Android)在繼承中發現一個奇怪的錯誤-我確定自己做錯了什么,但不確定。 我的課程SimonActivity擴展了GameActivity。

在GameActivity中,有一種方法可以設置名為gameVars的Map的值:

protected void setGameOptions(Bundle extras)
{
    Map<String, Integer> gameVars = new HashMap<String, Integer>();

    String difficulty = extras.getString(DIFFICULTY);

    for (TuningVariable t:tuningVars)
    {
        ...
        gameVars.put(t.name, varValue);
    }
}

現在,我嘗試在SimonActivity中重寫此操作,如下所示:

protected void setGameOptions(Bundle extras)
{
    super.setGameOptions(extras);

    winPoints = gameVars.get("winPoints");
    successBump = gameVars.get("successBump");
}

但是當我編譯時,SimonActivity給了我錯誤“找不到符號變量gameVars”。 SimonActivity中gameVars的實例在Android Studio中以紅色顯示; Studio在GameActivity中告訴我gameVars的內容已更新,但從未查詢過。

顯然,SimonActivity子類中的重寫方法無法從GameActivity超類中識別gameVars變量,即使我已經運行了super。 為什么不? 我應該改變什么?

(我嘗試將SimonActivity中的調用從gameVars更改為super.gameVars,但這並沒有什么不同。)

您應將gameVars聲明為gameVars的成員。 您是在方法調用中聲明它,因此一旦您的方法返回,它們將被刪除。 而且據我所知,覆蓋方法無法訪問該覆蓋方法的本地成員。

問題

因為gameVars是用於方法的局部變量setGameOptions (和只有它的調用期間存在)。

將其聲明為您的父類的字段

protected Map<String, Integer> gameVars = new HashMap<String, Integer>();
protected void setGameOptions(Bundle extras) {
    String difficulty = extras.getString(DIFFICULTY);
    for (TuningVariable t:tuningVars) {
        ...
        gameVars.put(t.name, varValue);
    }
}

gameVar的范圍只是基類中的該方法。

嘗試使其成為類屬性:

public class GameActivity{

protected Map<String, Integer> gameVars = new HashMap<String, Integer>();
///...
}

使gameVars受保護。 因此子類可以使用它。

protected final  Map<String, Integer> gameVars = new HashMap<String, Integer>();

您正在使用默認值。

從Java文檔開始-如果類沒有修飾符(默認值,也稱為package-private),則僅在其自己的包中可見(包被命名為相關類的組)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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