假设我有一个抽象类Game
:
public abstract class Game
{
public static final int FRAME_LENGTH = 40;
public static int getFrameLength() {
return Game.FRAME_LENGTH; //What do I have to replace Game with?
}
}
还有App
类扩展Game
:
public class App extends Game
{
private static final int FRAME_LENGTH = 50;
}
现在,当执行方法App.main()
时,它会打印40
,我希望50
,因为App
已覆盖FRAME_LENGTH
的值。我想我必须在self
类中使用Game
之类的东西,除了java没有self
。
如果事先不知道将要调用子类App.FRAME_LENGTH
,我应该如何访问静态属性App
?
好的,基于第一个答案,我想我必须稍微说明一下我的问题。
首先,我将FRAME_LENGTH
的范围更改为public
。为了这个问题,这使事情变得更容易。其次,我更改了以前称为getFrameLength
的方法main
。
我面临的问题:现在,我不知道哪些类会扩展Game
,而Game
也不需要知道。
如果查看代码,您将会看到Game.FRAME_LENGTH
为40
且App.FRAME_LENGTH
为50
。 Game.getFrameLength()
按预期返回40
,但App.getFrameLength()
返回50
,我希望(或者更愿意)返回50
。
我现在的问题很简单:在上面的代码中,我需要将return Game.FRAME_LENGTH;
更改为,所以它返回正确的值(意味着该方法的类的FRAME_LENGTH
的值调用),类似于PHP中的self::$frameLength
。
答案 0 :(得分:2)
您无法从main方法访问App.FRAME_LENGTH
变量,因为它被定义为private
类的App
。
此外,您不覆盖变量值(通过扩展类)。类继承与static
成员
更新
好像你根本不需要static
修饰符。你要做的是以下几点:
public abstract class Game {
private final int FRAME_LENGTH = 40;
public int getFrameLength() {
return this.getValue(); //<-- Note the usage of the "this" keyword.
}
// Every subclass of Game must implement this method
// and return their specific FRAME_LENGTH value
public abstract int getValue();
}
通过使用this
关键字,我们实际上正在调用Game
类的当前实例(可以是子类)。
现在,Game
的示例子类可以提供FRAME_LENGTH
的不同值。
public class App extends Game {
private final int FRAME_LENGTH = 50;
@Override
public int getValue() {
return FRAME_LENGTH;
}
}
现在,在调用new App().getFrameLength()
时,您实际上会返回App#getValue()
实施的结果,因此会收到50
。例如:
public static void main(String[] agrs) {
System.out.println(new App().getFrameLength());
}