Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这两种方法有什么区别?它们看起来都一样,但每种方法都会产生不同的输出_Java_Methods_Parameters_This - Fatal编程技术网

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

Java 这两种方法有什么区别?它们看起来都一样,但每种方法都会产生不同的输出,java,methods,parameters,this,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将得到点p的x和y值。事实并非如此。我有一个很长的代码。当我使用代码中的第一个方法时,我从程序中得到一个

第一种方法:

public PointMover (Point p)
{

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


}
第二种方法:

public PointMover (Point p)
{

    this.p = p;
    homePoint = p; 

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


谢谢。

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

但是,在第二种方法中,
homePoint
指向给定的参数
p
。如果在方法之外对参数
p
进行任何更改,这也将反映在
原点中

下面的代码举例说明了这种差异

示例代码

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]

第一个创建一个新点,其坐标与参数
p
相同,并将其指定给
this.p
。如果更改一个点的状态,则不会影响另一个点,因为您创建了一个副本


第二个参数将参数
p
赋给
this.p
。调用者和PointMover都引用完全相同的对象。如果调用者修改点的状态,则PointMover的点状态也将更改,因为您只有一个对象。如果PointMover更改点的状态,调用方的点状态也将更改,因为您只有一个对象。

第一个对象创建点的新实例并将其分配给homePoint,因此在传递给方法(构造函数)的点中所做的更改不会影响您的homePoint。这些是构造函数,而不是方法。