微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java传递的值明确

参见英文答案 > Is Java “pass-by-reference” or “pass-by-value”?                                    78个
我有一个Cell对象列表,代表棋盘类内的棋盘游戏.

Cell boardGame[][] = new Cell[8][8];

我需要一个临时单元来尝试玩家移动他并将其与其他单元格进行比较,所以我可以使用java pass-by-value来完成它.

test(board.boardGame);
board.printBoard(); 

private static void test(Cell[][] boardGame) {
Cell c = new Cell((new Soldier(Chesspiece.QUEEN,Color.WHITE)),7,4);
    boardGame[7][7] = c;

}

在这里读了一些关于java的帖子,但显然我仍然没有抓住它100%.

我希望在棋盘上只看到一个白皇后,但我看到了两个.
我知道如果你传递一个引用,你可以改变它的值,但是如果我传递数组本身,它的成员将不会被修改,除非我执行一个返回.

请帮助我更好地理解这个主题.
谢谢

编辑:

我认为我不明白什么时候它叫属性而哪些它没有.
如果你称之为“新”,我会有所不同.

当它的另一个对象的一部分称为属性对吗?但是每个对象都可以作为另一个对象的一部分创建.我可以在dog类中创建一个新字符串,然后在动物类中创建dog类,然后在另一个类中创建它.所以只有顶级类在堆栈中?

举个例子:

public class Board  { //fake class

    int num= 0;
    public void test(int i){
        i = 1;
    }
}

在另一个班级:

public class Main {
        static void outsideTest(Board board){
            board.num = 1;
        }
    public static void main(String[] args) {
        Board board = new Board();
        System.out.println(board.num);
        board.test(board.num);
        System.out.println(board.num);
        outsideTest(board);
        System.out.println(board.num);
}
}

现在我不明白为什么在test()方法上num没有改变而在outsidetest()上更改了num,因为它是板对象的一部分,因此在堆中创建了num,因此需要在两者上进行更改没有?

解决方法

Java本质上总是“按值传递”.

Caveat: It passes the value stored in the memory for the variable.

For primitive data types,the memory is allocated in stack space,whereas for objects reference memory is allocated in stack space but the object itself is created in heap. Similar can be stated for arrays too though they are not exactly objects in a strong sense.

下面的图表会更清楚.

Stack and Heap memory space

Array Allocation

你的Cell对象2D数组应该看起来像anObjectArrayVar(不完全是指向对象的图中的ref现在应该指向行,我们需要在ref和每行的对象之间的堆中进行另一级分配(a引用对象的单元格集.

因此,当您传递boardGame时,会传递存储在堆栈中的值,该值存储对象数组的引用(就像存储在anObjectArrayVar中的值一样).如果说refs列表存储在编号为50的位置,则anObjectArrayVar将存储该值,并在调用它时将该值传递给测试方法.在这种情况下,测试方法将无法转到内存位置anObjectArrayVar并更改其值(比如100),因为它只有值的副本,但它可以轻松地更改它所引用的内容(直接或间接)在ref或下一级(并添加新对象,如你的情况下添加一个带有queen的新单元)或它们指向的对象,这些更改将反映出整个程序!

我还想提请你注意代码的事实

boardGame[7][7] = c;

将取代当前的单元格(以及当前在其中的士兵),如果在游戏中的那个地方最初有一名士兵,那将会产生重大问题.游戏状态实际上会改变.

作为一个建议(考虑到你的设计知识有限),我会说至少在替换它之前将单元格保存在测试方法中的其他值中.

Cell old = boardGame[7][7];
//Now do all your operations
boardGame[7][7] = old;//just before returning from the function

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐