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和将来方法调用传入的实参也指向堆中同一个对象,为什么要新建一个对象?
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和将来方法调用传入的实参也指向堆中同一个对象,为什么要新建一个对象?
就算每次实例的线的两个端点都一样,但是是多条重叠的线,可是如果你p1=a(p2=b),那就是
只实例化了一条线,就是你所说的堆中的那条线,所以任一引用修改了端点值,其他的引用都变化了,
这应该不是你想要的结果吧~
如果你想做一个操作是这样子的。
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 中的参数地址一样。