先贴上源代码:public class Point{
    float x,
          y;
    
    Point(){
        x=0;
        y=0;
    }
    
    Point(int x1,float y1){
        x=x1;
        y=y1;
    }
}public class test {
    public static void main(String[] args) {
        List<Point> point=new ArrayList<Point>();
        point.add(new Point(0,0));
        point.add(new Point(1,1));
        point.add(new Point(2,2));
        
        List<Point> point1=new ArrayList<Point>(point);
        List<Point> point2=point;
        
        point1.get(1).y=100;
        
        Point tempPoint=point1.get(1);
        point1.set(1, point1.get(2));
        point1.set(2, tempPoint);        
        Point tempPoint=point1.get(1);
        point1.set(1, point1.get(2));
        point1.set(2, tempPoint);
        
        System.out.println("point:");
        System.out.println("("+point.get(0).x+","+point.get(0).y+")");
        System.out.println("("+point.get(1).x+","+point.get(1).y+")");
        System.out.println("("+point.get(2).x+","+point.get(2).y+")");        System.out.println("point1:");
        System.out.println("("+point1.get(0).x+","+point1.get(0).y+")");
        System.out.println("("+point1.get(1).x+","+point1.get(1).y+")");
        System.out.println("("+point1.get(2).x+","+point1.get(2).y+")");
        
        System.out.println("point2:");
        System.out.println("("+point2.get(0).x+","+point2.get(0).y+")");
        System.out.println("("+point2.get(1).x+","+point2.get(1).y+")");
        System.out.println("("+point2.get(2).x+","+point2.get(2).y+")");
    }
}
运行结果为:
point:
(0.0,0.0)
(1.0,100.0)
(2.0,2.0)
point1:
(0.0,0.0)
(2.0,2.0)
(1.0,100.0)
point2:
(0.0,0.0)
(1.0,100.0)
(2.0,2.0)问题:
List<Point> point1=new ArrayList<Point>(point);
所以point1是创建了一个新的一模一样的point对象
List<Point> point2=point;
所以point2是跟point都是指向同一个对象Point tempPoint=point1.get(1);
point1.set(1, point1.get(2));
point1.set(2, tempPoint);
我交换了point1[1]跟point1[2],对point跟point2无影响point1.get(1).y=100;
我设置point1[1]为100,为什么会影响到point跟point2?

解决方案 »

  1.   

    point1跟point 还有point2不是一个object reference。但是不管point,point1或者point2,他们里面的0号元素,1号元素还有2号元素都是同一个object reference。所以
    Point tempPoint=point1.get(1);
    point1.set(1, point1.get(2));
    point1.set(2, tempPoint);
    该操作是对point1直接操作,他跟point 还有point2不是一个object reference。所以没影响但是
    point1.get(1).y=100;
    该操作是对point1里面的1号元素进行操作,而point 还有point2里的1号元素跟point1里面的1号元素是同一个object reference。所以全部都被修改了。已经弄懂,结贴。
      

  2.   

    List底层是靠数组来实现的
    List<Point> point1=new ArrayList<Point>(point);这个构造方法底层其实就是将point1的内部数组直接赋值为point的内部数组,所以二者的内部数组是同一个引用,并不是说point1跟point是同一个引用,明显point1的引用new出来的新对象
      

  3.   

    point1跟point 还有point2不是一个object reference。但是不管point,point1或者point2,他们里面的0号元素,1号元素还有2号元素都是同一个object reference。
    理解是对的,有一点,List<Point> point2=point; 所以point2和point是同一个object reference