[英]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將獲得Point 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]
第一個創建一個新的Point,其坐標與參數p
相同,並將其分配給this.p
如果您更改了一個點的狀態,則不會影響另一個點,因為您制作了副本。
第二個將參數p
this.p
調用者和PointMover都指向完全相同的對象。 如果調用者修改了點的狀態,則PointMover的點狀態也將改變,因為您有一個對象。 如果PointMover改變了點的狀態,則調用者的點狀態也將改變,因為你有一個對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.