这两种方法有什么区别?它们看起来都一样,但每种方法都会导致不同的输出
What is the difference between these two methods? They both look the same but each method leads to different outputs
第一种方法:
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
是一个新的Object,所以改变参数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]
第一个创建一个新的点,坐标与参数p
相同,并将其赋值给this.p
。如果你改变一个点的状态,它不会影响另一个点,因为你复制了一个。
第二个将参数 p
赋值给 this.p
。调用者和 PointMover 都引用完全相同的对象。如果调用者修改点的状态,PointMover 的点状态也会改变,因为您只有一个对象。如果 PointMover 改变点的状态,调用者的点状态也会改变,因为你只有一个对象。
第一种方法:
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
是一个新的Object,所以改变参数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]
第一个创建一个新的点,坐标与参数p
相同,并将其赋值给this.p
。如果你改变一个点的状态,它不会影响另一个点,因为你复制了一个。
第二个将参数 p
赋值给 this.p
。调用者和 PointMover 都引用完全相同的对象。如果调用者修改点的状态,PointMover 的点状态也会改变,因为您只有一个对象。如果 PointMover 改变点的状态,调用者的点状态也会改变,因为你只有一个对象。