问题一:下面这段代码中我有一个地方看不懂,请指教~~~class Point {  
double x; 
double y;

Point(double xVal,double yVal){  
x = xVal;
y = yVal;
}
Point(final Point oldPoint){  //Here!问题在这里,这里为什么要用final来声明行参?这段代码应该是用来复制传递进来的对象的值,然后在内存中再创建一个新的对象,而之所以不再次调用构造函数创建一个新的对象主要是因为往往传递进来的对象值会被改变,所以才采用以上的方式来创建新的对象,但是一但用final声明了,那么在调用这个构造函数的时候岂不是不能改变作为实参值的对象了嘛。这不是互相矛盾了嘛~~~ 
x = oldPoint.x;
y = oldPoint.y;
}
}问题二:class Line{
Point start; 
Point end;

Line(final Point start, final Point end){ 
this.start = new Point(start);  //这里创建的对象,是属于point对象的?还是属于调用line构造函数所创建的对象的?
this.end = new Point(end);
}
Line(double xVal, double yVal){
          double a = xVal;  //为什么这里我声明的变量a 、b,然后通过实参对其赋值,但是这两个变量不属于对象呢?
          double b = yVal;
}
}

解决方案 »

  1.   

    1.用Final来声明Point 。是怕你在构造方法中改了原来的值。
    Point(final Point oldPoint){
        x = oldPoint.x;
        y = oldPoint.y;
        oldPoint.x = 12;//怕这种情况发生
        oldPoint.y = 12;//怕这种情况发生
    }2.this.start = new Point(start);
    就是Point start对象啊。相当于用了上面的Point(final Point oldPoint)这个构造方法产生的Point。“为什么这里我声明的变量a 、b,然后通过实参对其赋值,但是这两个变量不属于对象呢? ”不太明白你具体的意思。
      

  2.   

    首先感谢楼上的回答~~!!!关于楼上第一个问题的回答:
    难道这里的final是为了防止在构造函数中修改原来的值,而不是为了防止作为实参传递进来的值被改变?
    那么如果这个final是声明在一个方法中的呢?难道也是为了防止在构造函数中修改原来的值??关于第二个问题:
    也就是说,我在line构造函数中创建的是属于point的对象,并且被start引用。
    而不是被调用line构造函数的变量所引用的?Line(double xVal, double yVal){
              double a = xVal;  
              double b = yVal;

    这个意思是,程序可以编译,但是当用system.out.println()输出a和b的值的时候,编译器会报错,说没有这2个变量。
      

  3.   

    第一个注释:
    你理解错了,举个反例:
    Point(Point oldPoint){
    oldPoint = someOtherPoint;    //这样来,下面的赋值就不能保证期望的意图了
                                      //而1楼说final使之指向的值不能被修改是错了,试下就知道了
    x = oldPoint.x; 
    y = oldPoint.y;
    } 第二个注释:
    使用两个外部的点对当前line对象的start和end赋值。第三个注释:
    没有意义,因为a,b声明为一个局部变量,这个构造方法结束,a,b也就不存在了。
      

  4.   

    其实声明成final很好理解:不允许再更改引用了.就是说
    final Point p=new Point();
    你就不能再写一次p=new Point();是指引用不能再指向其它的对象
      

  5.   

    天哪~~~我又翻了下书,真不知道我智商有问题,还是那书写的模糊。“……,这样做的结果是防止在你调用该方法时代替形参的任何实参的
    值被修改。”
    第二句话“编译器会检查方法主体中的代码,以保证没有对final形式参数进行修改”
    我又看了一遍,第一句话我觉得还是很模糊。但是看第2句话,我就能理解 2 楼和 5 楼是正确的。~~这里感谢他们~~~事实上这是一个3段代码的例子,只不过写的相当复杂,我还有其他的地方不理解但是我会再一次重新去自己参悟,如果还有问题到是大家
    可要继续帮忙解答哦~~(其实我已经看这段例子不下4、5遍了,可是脑子里还是不能完全掌握编写这样代码的思想。)