spwe12b 2019-12-24 22:11 采纳率: 0%
浏览 194

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不是值传递吗

  • 写回答

3条回答 默认 最新

  • 「已注销」 2019-12-25 09:45
    关注

    你的第一次没变时写法时有问题的取的都是同一个对象,改成如下写法你就你知道了,至于你的第二次改变了是因为你两次操作的都是同一个对象所以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);
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面