【问题标题】:Object Clones and Knowing Underlying Object in Reference (JAVA)对象克隆和了解引用中的基础对象 (JAVA)
【发布时间】:2011-08-25 18:54:05
【问题描述】:

我正在尝试基于“生命游戏”模拟概念编写源代码。我所做的是创建一个类来表示游戏环境状态,但将后继函数的逻辑分离到不同的类中。游戏状态保存在一个简单的多维布尔数组中。

后继函数应该做的是将当前状态保存在一个新数组中作为原始数组的克隆,并在整个过程中使用它作为基础。然后它将游戏的当前状态作为参考,并使用游戏逻辑对其进行修改。我的问题是我将原始数据克隆到一个新变量中,但即使这个克隆也被后继函数修改。

我不太确定发生了什么,所以我无法正确调试。我更习惯 C# 对原始类型克隆的处理。

这是我的后继函数包装类的代码:

公共类继任者{

boolean[][] current_state;
public void next(WorldPopulation worldState){
    int dim_x = worldState.get_width();
    int dim_y = worldState.get_height();
    boolean[][] nextstate = worldState.get_state();
    current_state = worldState.get_state().clone();
    for(int i=0; i<dim_y; i++){
        for(int j=0; j<dim_x; j++){
            int neighbors = 0;
            neighbors = countThyNeighbors(i, j);
            if((neighbors>3 || neighbors<3) && current_state[i][j]){
                nextstate[i][j] = false;
            } else if(!current_state[i][j] && neighbors>=3) { nextstate[i][j] = true; }
        }
    }
}
private int countThyNeighbors(int y, int x) {
    int[] grid_x = { x-1, x, x+1, x-1, x+1, x-1, x, x+1};
    int[] grid_y = { y-1, y-1, y-1, y, y, y+1, y+1, y+1};
    int neighbors = 0;
    for(int i=0; i<8; i++){
        try{
        if(current_state[grid_y[i]][grid_x[i]])
            neighbors++;
        } catch(Exception e) { continue;}
    }
    return neighbors;
}

}

WorldPopulation 类中的 get() 和 set() 函数只是赋值和返回操作。

我对 C# 背景中的克隆(深克隆和浅克隆)的细微差别有所了解,但我对 Java 范例完全陌生。

非常感谢任何改进我的代码的建议,但我想知道发生了什么以及我做错了什么。非常感谢! :D

【问题讨论】:

    标签: java object reference clone


    【解决方案1】:

    多维数组表示为数组的数组。 Java 中的克隆方法很浅。这意味着多维数组不会被深度克隆。

    您可以实现自己的深拷贝方法或使用序列化,如here 所述

    【讨论】:

    • 谢谢。我想我理解得更好了! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多