2

我对编程电路很陌生,我正在尝试系统地学习 Java,目前最终在 Swing 结束。我想我知道 void 方法的作用和用途,但我无法理解这段示例代码(摘自http://docs.oracle.com --BorderLayoutDemo):

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())。

(已编辑问题。pivot 关键字是无效的,而不是静态的。我看到我已经用原始类型教授了这个概念(无效方法),这使事情变得混乱)

4

3 回答 3

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("****************************************");
    }
}

输出案例 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
****************************************
于 2012-11-03T14:19:39.683 回答
1

我认为您正在寻找 java 的按值传递的东西。查看这篇文章,您可能会了解代码中发生的事情背后的内容,以及为什么它没有按照您的预期工作。

于 2012-11-03T12:25:57.083 回答
1

对象是通过引用传递的,不会被复制。Java 通过引用而不是按值传递对象,正如您在 C 等语言中所习惯的那样。因此,您传递的addComponentsToPane(frame.getContentPane());是对框架内容窗格的实际引用。

然后静态方法使用该引用将按钮添加到实际内容窗格。没有充分的理由复制对象。例如,想象一下创建一个包含大量数据的类。每次将它传递给函数时都复制这个类是没有意义的。

对于 Java 中的“原始”类型,例如“int”或“double”,有一个例外。它们的处理方式与您在 C/C++ 中学习的方式相同。但是请记住,Integer 和 Double 是类。

希望有帮助!

于 2012-11-03T12:28:26.937 回答