在不知道类名的情况下获取静态属性的值

时间:2014-07-12 15:58:53

标签: java static extends

假设我有一个抽象类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_LENGTH40App.FRAME_LENGTH50Game.getFrameLength()按预期返回40,但App.getFrameLength()返回50,我希望(或者更愿意)返回50

我现在的问题很简单:在上面的代码中,我需要将return Game.FRAME_LENGTH;更改为,所以它返回正确的值(意味着该方法的类的FRAME_LENGTH的值调用),类似于PHP中的self::$frameLength

1 个答案:

答案 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());
}