java - 访问同一类中声明的对象的变量

标签 java

第一次来,在开发一个简单的策略游戏时遇到了 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/

相关文章:

java - 使用 ZBar (Android) SDK,我的应用程序从同一本书中获取不同的 ISBN

android - 无法加载库 :/usr/lib/jvm/java-6-openjdk/jre/lib/i386/xawt/libmawt. 所以

java - 一个 JFrame 和两个 JPanel

Java Swing BorderLayout resize困难

java - 如何在 DynamoDbEnhancedClient 中动态更改表名(Aws Sdk V2 for Java)

以前版本的 Java 8 可重复注释模拟

java - 如何在spring boot中使用mongoDB在实体之间建立关系映射?

Java - 使用多种方法时的性能考虑

java - 检查字符串是否按顺序包含子字符串的字符序列,但不一定彼此相邻

java - 64 位十六进制随机数值给出 16 个字符,有时给出 15 个字符,为什么?