访问在同一个类

时间:2016-03-07 17:30:45

标签: java

这里的第一个计时器,在处理一个简单的策略游戏时遇到了Java问题。这是:

尝试节省处理器时间,我使用int数组(多维)作为数据库接口。像这样:

//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,而不是任何真实的人。我是这样做的,因为我关注内存,因为resources占用的空间比opinionefficiencyprocesses多得多,绝对超过{{1} }}。此代码位于usercount。此类不是主类,也不包含class Game方法。此代码不在任何方法内,但它在类中。这里没有错误。

问题在于public static void main(String[] args)方法,它实际上会引发游戏。 void start(Main home, String save)监视当前活动的游戏及其变量和对象,并始终处于活动状态。在这里,在启动框架和面板,并生成一个地图(使用方法class Game())后,我想填写数组。这是相关的代码:

int[][] generateMap(int size)

标记的位置会生成以下NetBeans IDE 8.1错误:

//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;
                }
            }
        }
    }
}

同时按Alt和Enter即使没有将鼠标悬停在图标上也只显示错误。按下图标做了一个&#34;不能做&#34; Windows声音(Windows 10)。

根据我的理解,编译器无法从cannot find symbol: symbol: variable usercount location: variable users of type Object ---- (Alt-Enter shows hints) 方法访问对象users。有没有办法让我从公共方法,公共类,公共变量, public中访问对象,在 同一公共 类中制作?

如果没有,你能这么好解释一下:

A)为什么不呢?

B)我没有/错误地理解什么?

C)我能做什么呢?

我知道我很可能只是声明这些变量与任何start()对象分开。但是1)我想用一个名称引用那组变量,并且一个数组会不成比例地占用内存,2)我的问题可能会在以后的不同设置中出现,如果是这样我想知道如何处理它。

我知道我只是一个Java新手,但我尝试使用谷歌搜索,而不是他们帮助我他们在这里没有帮助我。也许我使用的是不正确的搜索字词,但如果是这样,那些条款就已经是一个巨大的帮助了。

感谢您阅读这段文字,如果您愿意帮助我,请多谢一下。

1 个答案:

答案 0 :(得分:3)

您在这里使用的方法并不是您想要的正确方法。当您宣布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非常擅长创建和管理对象,而且您尝试实现的性能提升实际上并不重要。更有可能的是,您的程序会让人感到困惑,以至于您最终编写的低效代码会比您只是将其编写为可读的速度慢。