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

Java 在不知道类名的情况下获取静态属性的值,java,static,extends,Java,Static,Extends,假设我有一个抽象类游戏: 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? } } public class App extends Game { p

假设我有一个抽象类
游戏

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?
    }
}
public class App extends Game
{
    private static final int FRAME_LENGTH = 50;
}
还有一个类
App
,它扩展了
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?
    }
}
public class App extends Game
{
    private static final int FRAME_LENGTH = 50;
}
现在,当执行方法
App.main()
时,它会打印
40
,我本以为
50
,因为
App
已经覆盖了
FRAME\u LENGTH
的值。我想我必须在
游戏
类中使用类似
self
的东西,除了java没有
self

我应该如何访问静态属性
App.FRAME\u LENGTH
,而事先不知道子类将被调用
App

编辑 好的,根据第一个答案,我想我必须详细说明我的问题

首先,我将
FRAME\u LENGTH
的范围更改为
public
。为了这个问题,这让事情变得更容易。其次,我更改了以前称为
main
的方法
getFrameLength

我面临的问题是:现在,我不知道哪些类将扩展
Game
,而且
Game
也不需要知道

如果您查看代码,您将能够看到
Game.FRAME\u LENGTH
40
,而
App.FRAME\u LENGTH
50
Game.getFrameLength()
按预期返回
40
,但是
App.getFrameLength()
返回
50
,我希望(或者更确切地说希望)它返回
50


我现在的问题很简单:在上面的代码中,我需要更改什么
return Game.FRAME\u LENGTH
to,因此它返回正确的值(即调用该方法的类的
FRAME\u LENGTH
的值),类似于PHP中的
self::$frameLength

您无法访问主方法中的
App.FRAME\u LENGTH
变量,因为它被定义为
App
类的
私有

另外,您不是在覆盖变量值(通过扩展类)。类继承与
静态成员无关


更新:

看起来您根本不需要
静态
修饰符。您需要做的是:

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();  
}
现在,当调用
newapp().getFrameLength()
时,您将实际返回
App#getValue()
实现的结果,因此将收到
50
。例如:

public static void main(String[] agrs) {
    System.out.println(new App().getFrameLength());
}

等一下。如果
FRAME\u LENGTH
是公共的,我可以(从任何地方)访问
App.FRAME\u LENGTH
并获得
50
,对吗?现在,当我运行方法App.main时,它需要访问该值。但是如果有另一个类,比如说
Example
扩展
Game
,当我运行
Example.main
时,应该使用
Example.FRAME\u LENGTH
中的值。在
Game.main
中如何定义它?当您键入
SomeClass.FRAME\u LENGTH
时,编译器将尝试访问名为
FRAME\u LENGTH
SomeClass
的静态成员。根据访问器的类型(
公共的
私有的
,等等),它是否可以访问。如果你想从
游戏
中获得
应用程序的框架长度
,你必须更改
应用程序
框架长度
私人
修饰符,使其范围更广。我对我的问题进行了一点修改,希望现在我的问题更清楚。在这种情况下,我实际上需要
静态
,但由于其他一些原因,这与这里的问题无关。如果不显式使用类名,真的没有办法访问当前类的静态属性吗?嗯……没有<代码>静态
变量与类实例没有关系。它们仅绑定到类定义,并通过
ClassName.StaticVariable
pattern.Override getFrameLength访问。