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访问。