在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,但这并没有什么不同。)
答案 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),它只在它自己的包中可见(包是相关类的命名组)。