Java传递的价值澄清了

Smi*_*One 3 java cell pass-by-value

我有一个Cell对象列表,代表棋盘类内的棋盘游戏.

Cell boardGame[][] = new Cell[8][8];
Run Code Online (Sandbox Code Playgroud)

我需要一个临时单元来尝试玩家移动他并将其与其他单元格进行比较,所以我可以使用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;

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:

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

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

举个例子:

public class Board  { //fake class

    int num= 0;
    public void test(int i){
        i = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个班级:

    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);
}
}
Run Code Online (Sandbox Code Playgroud)

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

mpk*_*nje 5

记住它的最好和最不容易的方法如下:Java按值传递所有内容,包括引用.:)

当你有一个变量时:

Object a = new Object();
Run Code Online (Sandbox Code Playgroud)

你实际上没有存储对象a.你所拥有的是对内存中某个对象的引用.

同样,当您在对象上调用方法时:

String b = a.toString();
Run Code Online (Sandbox Code Playgroud)

你不这样做.您调用的是一种方法,它使用引用对象的数据作为其上下文.

所以当你传递一个对象作为参数时

System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

你没有传递整个对象.传递引用,该引用按值传递.

编辑:

如果引用没有通过值传递,而是通过引用,你可以做这样的事情,幸运的是你做不到.

public void swap(Object a, Object b){
   Object swap = a; a = b ; b = swap;
} 

String a = "a";
String b = "b";
swap(a,b);

// would print "b a" if references were 
// passed by reference but instead prints 
// "a b" as they're passed by value.
System.out.println(a + " " b);
Run Code Online (Sandbox Code Playgroud)