这两种方法有什么区别?它们看起来都一样,但每种方法都会产生不同的输出

时间:2015-01-16 10:03:07

标签: java methods parameters this

第一种方法:

public PointMover (Point p)
{

    this.p = p;
    homePoint = new Point (p.x, p.y);


}

第二种方法:

public PointMover (Point p)
{

    this.p = p;
    homePoint = p; 

}

首先,我认为对于这两种方法,homePoint将获得Point p的x和y值。事实证明并非如此。我和我有很长的代码。当我在代码中使用第一个方法时,我从程序中获得一个输出。当我在代码中使用第二种方法而不是第一种方法时,我从程序中获得了完全不同的输出。那么这两种方法有什么区别? homePoint在这些方法中的作用是什么?

谢谢。

2 个答案:

答案 0 :(得分:3)

不同之处在于,在第一种方法中,homePoint是一个新的对象,因此更改参数p的坐标不会对字段homePoint产生任何影响。

然而,在第二种方法中,homePoint指向给定的参数p。如果在方法之外,您将任何内容更改为参数p,则这也会反映在homePoint中。

以下代码举例说明了差异

示例代码

public class Test {
    public Point homePoint;

    public static void main(String[] args) {
        Point p = new Point(4, 3);
        Test test = new Test();

        System.out.println("test1:");
        test.test1(p);
        System.out.println("home point : " + test.homePoint);
        System.out.println("p          : " + p);
        p.x = 8;
        System.out.println("home point : " + test.homePoint);
        System.out.println("p          : " + p);

        System.out.println("test2:");
        test.test2(p);
        System.out.println("home point : " + test.homePoint);
        System.out.println("p          : " + p);
        p.x = 4;
        System.out.println("home point : " + test.homePoint);
        System.out.println("p          : " + p);


    }

    public void test1(Point point) {
        homePoint = new Point(point.x, point.y);
    }

    public void test2(Point point) {
        homePoint = point;
    }
}

<强>输出

test1:
home point : java.awt.Point[x=4,y=3]
p          : java.awt.Point[x=4,y=3]
home point : java.awt.Point[x=4,y=3]
p          : java.awt.Point[x=8,y=3]
test2:
home point : java.awt.Point[x=8,y=3]
p          : java.awt.Point[x=8,y=3]
home point : java.awt.Point[x=4,y=3]
p          : java.awt.Point[x=4,y=3]

答案 1 :(得分:0)

第一个创建一个新Point,其坐标与参数p相同,并将其分配给this.p。如果你改变一个点的状态,它就不会影响另一个点,因为你复制了一个。

第二个将参数p分配给this.p。调用者和PointMover都指向完全相同的对象。如果调用者修改了点的状态,则PointMover的点状态也将改变,因为您有一个对象。如果PointMover改变了点的状态,则调用者的点状态也将改变,因为你有一个对象。