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本质上总是“按值传递”.
下面的图表会更清楚. 你的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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |