静态方法的修改值操作截至以及没有成功是什么原因?

 

public static void main(String[] args) {
 String str="hello";
    Point p=new Point(1,2);
    Point[] arr2 = {new Point(1,2),new Point(3,4),new Point(5,6),p};
    say(p,arr2,str);
    System.out.println(str);
    System.out.println("p:"+p);//6,6
    System.out.println("arr2:"+Arrays.toString(arr2));//

}
public static void say(Point p, Point[] arr2,String str){
        str = "world";
        p.setX(4);
        p = arr2[2];
        p.setX(6);
        arr2 = Arrays.copyOf(arr2, arr2.length-1);
        arr2[2].setX(8);
        arr2 = new Point[]{new Point(2,2),p};
        arr2[arr2.length-1].setX(12);
    }
}

例如下图,静态方法中p.setX(4);将p的x改为四就赋值成功,但是p = arr2[2]和p.setX(6);就没有赋值给p,所以这种赋值操作什么时候成功,什么时候不成功,什么时候截至,原因是什么?另外str的值为什么也没改变?

2.数组缩容以后,arr2[2].setX(8);将数组中的第三个元素x改为8,也就是最后一个,之后数组重新new了一个对象,又传了一个p,这样数组里应该有五个元素了,但是输出结果只有四个,之后将数组的最后一个元素的x改为12,但是输出结果只有四个元素,而且值还是4,2;第三个元素的x值为什么是12?

 

 

 

看一下java的值传递和引用传递

如果你把你的代码拆成多个测试函数,就比较容易看出问题。

把你的代码拆成一系列独立的测试函数  test1, test2, test3... 这样。

懒人包:  

  • p 是最开始array[2]的引用,也就是原数组的第3个元素,你把 p 放到最新分配的array的最后一个元素,然后刚好修改到了它,原数组的第3个元素当然也就跟着变了。
  • 数组做函数参数的时候,传入的是数组的引用的拷贝,因此在函数内重新赋值 arr2 = new ... 并不会改变函数外原来的数组。
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632