Java重写方法无法识别超级中定义的变量

时间:2016-10-15 18:22:49

标签: java android

在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给了我错误&#34;找不到符号变量gameVars&#34 ;; SimonActivity中的gameVars实例在Android Studio中显示为红色;在GameActivity中,Studio告诉我gameVars的内容已更新,但从未查询过。

显然,SimonActivity子类中的重写方法不是从GameActivity超类中识别gameVars变量,即使我已经运行了super。为什么不?我应该改变什么?

(我尝试将SimonActivity中的调用从gameVars更改为super.gameVars,但这并没有什么不同。)

4 个答案:

答案 0 :(得分:2)

您应该将gameVars声明为GameActivity的成员。你在方法调用中声明它,所以一旦你的方法返回它们就会被删除。另据我所知,重写方法无法访问重写方法的本地成员。

答案 1 :(得分:1)

问题

因为gameVars是方法setGameOptions的局部变量(并且仅在其调用期间存在)。

解决方案

将其声明为您父类的field

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);
    }
}

答案 2 :(得分:1)

gameVar的范围就是基类中的那个方法。

尝试将其设为类属性:

public class GameActivity{

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

答案 3 :(得分:0)

将gameVars视为受保护。所以子类可以使用它。

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

您正在使用默认值。

来自Java Docs - 如果一个类没有修饰符(默认的,也称为package-private),它只在它自己的包中可见(包是相关类的命名组)。