java方法传参是值传递还是引用传递呢?

我的测试如下:
Node是一个节点类,其有一个Node类型的属性

public class Node {
    public Node next;
}

这是主类,其有一个Node属性

public class Test {
    public Node node;
    public Test(){
        node=new Node();
        node.next=new Node();
    }
    public void go(){
        this.change(node);
    }
    public void change(Node node){
       node=new Node();
    }
}

当我想通过change方法改变node时
测试方法:

public static void main(String[] args) {
        Test test=new Test();
        System.out.println(test.node);
        test.go();
        System.out.println(test.node);
    }

输出:

test.Node@619a5dff
test.Node@619a5dff

发现node属性并没有改变,但是我如果想改变node.next时

 public void change(Node node){
        node.next=new Node();
    }

测试方法:

public static void main(String[] args) {
        Test test=new Test();
        System.out.println(test.node.next);
        test.go();
        System.out.println(test.node.next);
    }

输出:

test.Node@619a5dff
test.Node@1ed6993a

却发现node.next改变了,这是为什么啊,java不是值传递吗

你的第一次没变时写法时有问题的取的都是同一个对象,改成如下写法你就你知道了,至于你的第二次改变了是因为你两次操作的都是同一个对象所以node属性值改变了。

class Node {
    public Node next;
}
class Test1 {
    public Node node;
    public Test1(){
        node=new Node();
        node.next=new Node();
    }
    public void go(){
        node = this.change(this.node);
    }
    public Node change(Node node){
        node=new Node();
        return node;
    }
}
class Test2{
    public static void main(String[] args) {
        Test1 test=new Test1();
        System.out.println(test.node);
        test.go();
        System.out.println(test.node);
    }
}

图片说明

其实简单来说,你想要改变一个对象的属性,应该传入这个对象的地址值,然后在方法中给这个对象的属性重新赋值,而不是传入这个对象的属性的地址值

基本数据类型是值传递,其他都是引用传递。
你的例子有问题,java万物皆引用(除了基本数据类型),你的“ node=new Node();”只是改变了你自己的引用

问答版主就是牛,从现在起只回论坛,不在踏入问答半步