簡體   English   中英

這兩種方法有什么區別? 它們看起來都一樣,但每種方法都會產生不同的輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM