2012-11-03 44 views
2

我對編程電路相當陌生,並且正在嘗試在Swing中系統地學習Java。我想我會得到什麼無效的方法做的,是用於,但我不能換我的頭周圍這片的示例代碼(從http://docs.oracle.com --BorderLayoutDemo提取):使用void方法添加按鈕

public class BorderLayoutDemo { 

public static void addComponentsToPane(Container pane) { 

    JButton button = new JButton("Button 1 (PAGE_START)"); 
    pane.add(button, BorderLayout.PAGE_START); 

} 

private static void createAndShowGUI() { 

    JFrame frame = new JFrame("BorderLayoutDemo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    **addComponentsToPane(frame.getContentPane());** 
    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    createAndShowGUI(); 

} 
} 

爲什麼這段代碼的工作,導致一個窗口有1個按鈕(我預計這會導致一個空的窗口)。是不是frame.getContentPane()作爲參數給出,並複製到addComponentsToPane()並在此void方法結束時銷燬(未添加到框架)?爲什麼它不應該返回可以添加到框架的Container對象或JPanel對象(即frame.add())。

(編輯問題。樞軸關鍵字是無效的,不是一成不變的。我看到我已經教這個概念(無效的方法)與原始類型其迷惑物質)

+0

沒有人明白爲什麼你不認爲它會工作。這不是很好的代碼,但每個語句都很清楚它的功能。 addComponentsToFrame將組件添加到您在參數中提供的內容框架。一旦它們被添加,框架就被打包並顯示(setVisible)。非常簡單。 – Pete855217

+0

但我明白爲什麼Stegeman不認爲它會起作用;這個問題也很清楚他認爲會發生什麼,並且很容易解釋哪些假設是錯誤的。他所得到的答案解決了他明確的問題,而你錯誤地認爲「沒人理解」。 – arcy

+0

我試圖簡化代碼以保持簡短的問題並顯示相關的語句。 Tzhechev先生明白我的意思。 (忍者) – Stegeman

回答

1

我認爲你正在尋找pass-按值的東西的Java。看看這個article,你可能會理解代碼背後發生的事情,以及爲什麼它不按你的期望工作。

1

該對象通過引用傳遞,不會被複制。 Java通過引用而不是按值傳遞對象,因爲您可能習慣於像C這樣的語言。所以,您傳遞的內容addComponentsToPane(frame.getContentPane());是對框架內容窗格的實際引用。

靜態方法然後使用該引用將按鈕添加到實際內容窗格。沒有充分的理由複製對象。想象一下,例如,創建一個包含大量數據的類。每當你將它傳遞給函數時,複製這個類是沒有意義的。

對於Java而言,對於'原始'類型(例如'int'或'double'),存在一個例外。這些處理方式與您在C/C++中學到的方法相同。請記住,Integer和Double是類,但是。

希望有幫助!

+1

謝謝!我試圖用int來得到這個行爲。這讓我很困惑。 – Stegeman

+0

恕我直言,你是完全錯誤的說**對象在Java中通過引用傳遞**。相反,對象引用通過Java中的值傳遞,更好地閱讀清楚或提出問題,以便人們可以在這個主題上以正確的方式回答您。 -1只是出於原因,你說的Java對象是通過引用傳遞的,這從來就不是這樣。對象不會被引用傳遞,因爲你可以在C中做到這一點。我很驚訝有人投票給你這個東西。 –

+0

我不覺得進入這個特別的區別會有助於清除原來的問題。是的,你說的正確的是,對象沒有像C中那樣通過引用傳遞,我從來沒有說過你不能在C中做這件事。我沒有深入細節,因爲這個問題不能保證,不是因爲我需要更清楚地閱讀。 – tzhechev

1

爲了澄清@tzhechev,對象不是通過Java中的引用傳遞的,而是通過Java中的值傳遞對象引用,這在Abu的答案中非常明確。爲了更清楚地說明這個話題,請看這個例子。

class Employee 
{ 
    String name; 
    int age; 
} 

public class ValueOrReference 
{ 
    public static void main(String... args) 
    { 
     Employee emp1 = new Employee(); 
     emp1.name = "Myself"; 
     emp1.age = 1; 
     Employee emp2 = new Employee(); 
     emp2.name = "Yourself"; 
     emp2.age = 2; 
     System.out.println("Before swapping values are : "); 
     System.out.println("Employee 1 : "); 
     System.out.println("Name : " + emp1.name); 
     System.out.println("Age : " + emp1.age); 
     System.out.println("Employee 2 : "); 
     System.out.println("Name : " + emp2.name); 
     System.out.println("Age : " + emp2.age); 
     /* 
     * Now if Objects are passed by Reference 
     * then if I swap the two objects in a method, 
     * then the actual objects will reciprocate 
     * to the said change. Lets find out. 
     */ 
     swapObjects(emp1, emp2); 
     System.out.println("****************************************"); 
     System.out.println("Inside main after swap method."); 
     System.out.println("After swapping values are : "); 
     System.out.println("Employee 1 : "); 
     System.out.println("Name : " + emp1.name); 
     System.out.println("Age : " + emp1.age); 
     System.out.println("Employee 2 : "); 
     System.out.println("Name : " + emp2.name); 
     System.out.println("Age : " + emp2.age); 
     System.out.println("****************************************"); 
    } 

    private static void swapObjects(Employee emp1, Employee emp2) 
    { 
     System.out.println("****************************************"); 
     System.out.println("Inside the swap method."); 
     Employee temp = emp1; 
     emp1 = emp2; 
     emp2 = temp; 
     System.out.println("After swapping values are : "); 
     System.out.println("Employee 1 : "); 
     System.out.println("Name : " + emp1.name); 
     System.out.println("Age : " + emp1.age); 
     System.out.println("Employee 2 : "); 
     System.out.println("Name : " + emp2.name); 
     System.out.println("Age : " + emp2.age); 
     System.out.println("****************************************"); 
    } 
} 

輸出案例1:

C:\Mine\JAVA\J2SE\classes>java ValueOrReference 
Before swapping values are : 
Employee 1 : 
Name : Myself 
Age : 1 
Employee 2 : 
Name : Yourself 
Age : 2 
**************************************** 
Inside the swap method. 
After swapping values are : 
Employee 1 : 
Name : Yourself 
Age : 2 
Employee 2 : 
Name : Myself 
Age : 1 
**************************************** 
**************************************** 
Inside main after swap method. 
After swapping values are : 
Employee 1 : 
Name : Myself 
Age : 1 
Employee 2 : 
Name : Yourself 
Age : 2 
**************************************** 

但如果我只使用一個對象,然後修改它的內容在一些方法,那麼結果將是驚人的。嘗試爲驚喜,下面的代碼:

class Employee 
{ 
    String name; 
    int age; 
} 

public class ValueOrReference 
{ 
    public static void main(String... args) 
    { 
     Employee emp1 = new Employee(); 
     emp1.name = "Myself"; 
     emp1.age = 1; 
     System.out.println("Before swapping values are : "); 
     System.out.println("Employee 1 : "); 
     System.out.println("Name : " + emp1.name); 
     System.out.println("Age : " + emp1.age); 
     /* 
     * Now if Objects are passed by Reference 
     * then if I swap the two objects in a method, 
     * then the actual objects will reciprocate 
     * to the said change. Lets find out. 
     */ 
     modifyObject(emp1); 
     System.out.println("****************************************"); 
     System.out.println("Inside main after modify method."); 
     System.out.println("After modifying values are : "); 
     System.out.println("Employee 1 : "); 
     System.out.println("Name : " + emp1.name); 
     System.out.println("Age : " + emp1.age); 
     System.out.println("****************************************"); 
    } 

    private static void modifyObject(Employee emp1) 
    { 
     System.out.println("****************************************"); 
     System.out.println("Inside the modify method."); 
     emp1.name = "Yourself"; 
     emp1.age = 2; 
     System.out.println("After modifying values are : "); 
     System.out.println("Employee 1 : "); 
     System.out.println("Name : " + emp1.name); 
     System.out.println("Age : " + emp1.age); 
     System.out.println("****************************************"); 
    } 
} 

OUTPUT案例2:

C:\Mine\JAVA\J2SE\classes>java ValueOrReference 
Before swapping values are : 
Employee 1 : 
Name : Myself 
Age : 1 
**************************************** 
Inside the modify method. 
After modifying values are : 
Employee 1 : 
Name : Yourself 
Age : 2 
**************************************** 
**************************************** 
Inside main after modify method. 
After modifying values are : 
Employee 1 : 
Name : Yourself 
Age : 2 
**************************************** 
+0

謝謝你澄清這一點。我完成了Abu發佈的文章,很好地解釋了這個原理。因此,如果我得到了正確的結果,它會通過值傳遞引用,除了基本類型的情況下,在創建新引用時複製對象本身?感謝所有的答案,並幫助我在這個相當基本的理解!偉大的社區。 – Stegeman