2013-02-25 83 views
-1

我是新來的Java,並且需要的參數幫助理解的方式來通參考的數據類型的方法或構造函數的參數使用參考的數據類型的方法或構造

Oracle的J2SE教程說:

在這個例子中,該方法將創建一個新的多邊形對象,並從點對象的數組進行初始化(假定點是一個表示X A類,y座標):

public Polygon polygonFrom(Point[] corners) { 
    // method body goes here 
} 

但這並沒有幫助我理解這個概念。詳細的解釋非常感謝。

+0

檢查這些鏈接。 http://stackoverflow.com/questions/40480/is-java-pass-by-reference和 http://stackoverflow.com/questions/4319537/how-do-i-pass-a-primitive-數據類型引用 – Alex 2013-02-25 05:23:29

回答

1

在代碼中,多邊形是這樣:

Point[] points = new Point[]{new Point(1,1), new Point(2,2)}; 
Polygon p = polygonFrom(points); 

除了與您的括號的內角的陣列。

這基本上給polygonFrom函數points陣列和做它喜歡什麼。然而,無論polygonFrom方法確實不會改變原始的points數組,但它會創建它自己的操作。

例如,可以說我有代碼,像這樣:

String s = "Cheeseburger"; 
sayString(s); 

和方法:

public void sayString(String par1) 
{ 
    par1 = par1 + "1"; 
    System.out.println(par1); 
} 

此輸出:Cheeseburger1,但字符串s仍然只有Cheeseburger

如果您需要進一步澄清,請詢問。

編輯: 保羅Bellora指出,有一些情況,其中polygonFrom方法可以改變points陣列,我會嘗試在這裏解釋一下。然而,如果這沒有任何意義,那麼你不應該擔心它(所有這些都是需要考慮的)。

polygonFrom方法可以在其自己的方法和整個類內更改任何變量。因此,如果points陣列在方法之外初始化(即在main方法之外),則polygonFrom方法可能會更改points陣列,但前提是方法內部的代碼表示直接更改該變量。我希望這是有道理的。

例如,在類:

Point[] points; 

public MethodAccess()//constructor 
{ 
    points = new Point[]{new Point(1,1), new Point(2,2)}; 
    Polygon p = polygonFrom(points); 
} 

public Polygon polygonFrom(Point[] corners){ 

    //doing stuff with corners variable here 

    points = corners; //this will change the points variable that was passed 

} 

構造將發送polygonFrompoints變量,但polygonFrom得到變量,並創建它的一個新的實例。 polygonFrom方法現在會更改其最新創建的corners變量,該變量最初的值與points的值相同。但是,如果方法polygonFrom明確說要更改points變量,那麼它在技術上會更改構造函數發送給它的變量。

+0

此答案具有誤導性,因爲數組*的內容可以通過傳入的方法進行修改。我認爲你試圖做的一點是,可以在方法中重新分配對數組的引用,並且調用站點上的引用仍然會指向原始數組對象。 – 2013-02-25 05:29:57

+0

@PaulBellora謝謝!你是對的。我在一節中添加了解釋,但我不確定我是否解釋得很好。 – 2013-02-25 05:40:29

+0

@Ionnez謝謝你的時間。我知道我在問很多......但我是一個純粹的人。你能解釋一下你自己的例子嗎??謝謝 – 2013-02-25 11:18:07

0

其簡單,檢查下面的代碼 -

public void a() { 
    List<String> list = new ArrayList<String>(); 
    b(list); 
} 

public void b(List<String> list) { 
    list.add("something"); 
} 

方法a()創建的列表,並通過它的參考方法b(),使B()可以修改列表的內容。所以在這種情況下,列表是一樣的,只是它的參考被傳遞了。列表的副本不在此處。

希望這會有所幫助。

相關問題