public class Point{   //点,坐标x,y
   private int x,y;
   public Point(int x,int y){
       this.x=x;
       this.y=y;
   }
   public int GetX(){
      return x;
   }
   public int GetY(){
      return y;
   }
}
class Line{
   private Point p1,p2;  //线段的两个端点
   Line(Point a,Point b){
     p1=new Point(a.GetX(),a.GetY());
     //此处为什么不用p1=a?
     
     p2=new Point(b.GetX(),b.GetY());
     //次数为什么不用p2=b?
   }
   public double Length(){ //Body } }注释是书上本来就加了。
就是想问一下为什么不可以?
既然Line()方法的参数是两个对象,用p1=a(p2=b)不就意味着p1和a指向堆中同一个对象么,而形参a和将来方法调用传入的实参也指向堆中同一个对象,为什么要新建一个对象?

解决方案 »

  1.   

    Point是mutable的。私有状态不应和外部数据共享,否则很容易被破坏。
      

  2.   

    这个是有区别的,应为你这个是个线的类,所以在你实例化的时候,是每次都实例一条新的线,
    就算每次实例的线的两个端点都一样,但是是多条重叠的线,可是如果你p1=a(p2=b),那就是
    只实例化了一条线,就是你所说的堆中的那条线,所以任一引用修改了端点值,其他的引用都变化了,
    这应该不是你想要的结果吧~
      

  3.   

    如果不新建一个对象的话外部的a对象被改过之后,Line里面的对象也会被相应的改变。
    如果你想做一个操作是这样子的。
    Point a = new Point(10, 10);
    Point b = new Point(10, 10);
    画一条线 Line line = new Line(a, b);
    到这里看似很正常,但当你想把b点再移一些距离再画呢?怎么办?
    直接设置b? 如下面?
    b.setX(20); 
    Line line1 = new Line(a, b);
    到这里看似很正常。但却不是你想要的结果。因为用到b的line中的b对象也被相应的改变了。
    也就是说 line 中的参数与 line1 中的参数地址一样。