第一次来,在开发一个简单的策略游戏时遇到了 Java 问题。这里是:
为了节省处理器时间,我使用 int 数组(多维)作为数据库接口(interface)。像这样:
//database variables
public int mapSize;// amount of tiles along one side of the map
public int[][] map;// [area id] - [resource type] - value
public int[][][] trades;// [trade id] - [sender/recipient] - [resource type] - value
public Object users = new Object(){
public int usercount;// amount of users in the game
public int[][] opinion;// [first user id] - [second user id] - value
public int[][][] resources;// [user id] - [resource type] - [value type] - value
public int[][] efficiency;// [user id] - [resource type] - value
public int[][] processes;// [user id] - [resource type] - value
};
//public math function (triangular numbers by iteration)
public int triNum(int i){
return (int) i*(i+1)/2;
}
正如你所看到的,我使用了一个Object()
来存储用户数据。这里的用户指的是玩家+AI,而不是任何实际的人。我这样做是因为我担心内存,因为资源
比意见
、效率
或进程占用更多的空间
,并且绝对超过用户数
。此代码位于类 Game
中。该类不是主类,也不包含 public static void main(String[] args)
方法。该代码不在任何方法内,但在类内。这里没有错误。
问题在于 void start(Main home, String save)
方法,该方法实际上启动了游戏。 类 Game()
监视当前 Activity 的游戏及其变量和对象,并且始终处于 Activity 状态。在这里,在启动框架和面板并生成 map (使用方法int[][]generateMap(int size)
)之后,我想填充数组。这是相关代码:
//DATA VARIABLES
if (save.equals("new")){
//make map
mapSize = 9;//placeholder value - retrieve actual value from settings file later
int mapScale = (int) Math.pow(mapSize, 2);
map = generateMap(mapSize);//9x9 grid
//make users
users.usercount = (int) Math.pow(mapSize / 3, 2);//<--- ERROR HERE
for (int i = 0; i < users.usercount; i++){//<--- ERROR HERE
}
//make trades
trades = new int[triNum(users.usercount - 1)][1][8];//<--- ERROR HERE
for (int[][] trade : trades) {
//fill array with appropriate values
for (int j = 0; j < users.usercount; j++) {//<--- ERROR HERE
for (int k = 0; k < users.usercount; k++) {//<--- ERROR HERE
if (j < k) {
trade[0][0] = j;
trade[1][0] = k;
}
}
}
}
}
标记的位置生成以下 NetBeans IDE 8.1 错误:
cannot find symbol:
symbol: variable usercount
location: variable users of type Object
----
(Alt-Enter shows hints)
即使未将鼠标悬停在图标上,同时按 Alt 和 Enter 也会显示错误。按下图标会发出“无法执行”Windows 声音 (Windows 10)。
据我了解,编译器无法通过 start()
方法访问对象 users
。有什么方法可以让我从 public 类中的 public 方法访问 public 类中的 public 变量吗? 对象,在同一个公共(public)类中创建?
如果没有,请您解释一下:
A)为什么不呢?
B)我不理解/不正确理解什么?
C)我还能做什么?
我知道我完全可以将这些变量与任何 users
对象分开声明。但是1)我想用一个名称引用那组变量,而数组会占用大量内存,2)我的问题可能稍后会在不同的设置中出现,如果是这样,我想知道如何处理它。
我知道我只是一个 Java 新手,但我尝试过使用谷歌搜索,虽然他们在其他方面帮助了我,但在这里却没有帮助我。也许我使用了不正确的搜索词,但如果是这样,那么这些词就已经是一个巨大的帮助了。
感谢您阅读这面文字墙,如果您愿意在这里帮助我,那就更加感谢您了。
最佳答案
您在这里使用的方法不是执行您想要的操作的正确方法。当您像这样声明 users
时,这就是所谓的 anonymous class 。基本上,它会变成带有自动生成名称的完整类声明。
由于 Java 类型系统的工作方式,您只能(直接)访问对象的字段和方法(如果它们是在您用来引用该对象的引用的类型中声明的)。例如,如果您说 Object o = "string"
,您可以使用 Object
的任何方法,但不能调用仅存在于String
,因为编译器不知道您拥有的实际上是一个String
。
这对您来说是一个问题,因为您无法将对象转换为其实际类型,因为类本身是匿名的。如果没有反射,就无法将这些字段从其中取出,这使得该对象实际上毫无用处。
正确的方法是将这些字段直接放入您声明 users
的类中,或者创建一个单独的类来保存这些字段:
class Users {
public int usercount;
public int[][] opinion;
public int[][][] resources;
public int[][] efficiency;
public int[][] processes;
};
然后稍后通过该类名引用它:
Users users = new Users();
既然您现在已经为类指定了名称,编译器就可以安全地知道它是什么类型以及它包含哪些字段。
顺便说一句,这些数组仍然很难理解。不要害怕声明对象以有用的方式表示您的数据。 JVM 非常擅长创建和管理对象,并且您试图实现的性能提升实际上不太可能产生影响。更有可能的是,您的程序将非常困惑,以至于您最终会编写低效的代码,这些代码比您简单地编写可读性的代码要慢。
关于java - 访问同一类中声明的对象的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35850144/