Java 使用void方法添加按钮

Java 使用void方法添加按钮,java,swing,static,add,Java,Swing,Static,Add,我对编程电路还很陌生,目前我正在尝试系统地学习Java,最终在Swing学习。我想我了解了void方法的功能和用途,但我无法理解这段示例代码(摘自--BorderLayoutDemo): 为什么这段代码可以工作,导致一个带有1个按钮的窗口(我希望这只会导致一个空窗口)。frame.getContentPane()不是作为参数复制到addComponentsToPane()并在该void方法结束时销毁(不是添加到frame)吗?为什么它不应该返回一个容器对象或JPanel对象,然后可以将其添加到框

我对编程电路还很陌生,目前我正在尝试系统地学习Java,最终在Swing学习。我想我了解了void方法的功能和用途,但我无法理解这段示例代码(摘自--BorderLayoutDemo):

为什么这段代码可以工作,导致一个带有1个按钮的窗口(我希望这只会导致一个空窗口)。frame.getContentPane()不是作为参数复制到addComponentsToPane()并在该void方法结束时销毁(不是添加到frame)吗?为什么它不应该返回一个容器对象或JPanel对象,然后可以将其添加到框架中(即frame.add())


(问题编辑。pivot关键字是void,而不是static。我知道我已经用基本类型学习了这个概念(void方法),这会混淆问题)

我想你正在寻找java的传递值的东西。看看这一点,您可能会理解代码中发生的事情背后的原因,以及为什么它不能按照您的期望工作。

对象是通过引用传递的,而不是复制的。Java通过引用而不是通过值来传递对象,这在C等语言中可能会用到。因此,使用
addComponentsToPane(frame.getContentPane())传递的是什么
是对框架内容窗格的实际引用

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

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


希望有帮助

为了澄清@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
****************************************

没人明白为什么你认为这不管用。这不是很好的代码,但每一条语句都非常清楚它的作用。addComponentsToFrame将组件添加到参数中提供的内容框架中。添加后,框架将打包并显示(setVisible)。非常简单。但我确实理解为什么Stegeman认为它行不通;这个问题也很清楚他认为会发生什么,并且很容易解释什么假设是错误的。他得到的答案回答了他明确的问题,你说的“没人理解”是错误的。我试图把代码浓缩一点,以保持问题简短,并展示相关的陈述。泽切切夫先生确实理解我。(忍者)谢谢!我试着用int得到这种行为。这让我很困惑。IMHO,uou说ObjExt在Java中是通过引用传递的,这是完全错误的。相反,Java中的对象引用是按值传递的,最好读清楚或者问一个问题,这样就可以正确地回答这个主题-1从我的角度来看只是因为,你说Java中的对象是通过引用传递的,这从来都不是事实。对象永远不会通过引用传递,正如你在C中所做的那样。我很惊讶有人在这件事上投票支持你。我不觉得进入那个特殊的区别会有助于澄清最初的问题。是的,你是对的,在C中对象不是通过引用传递的,我从来没有说过你不能在C中这样做。我没有进入细节,因为这个问题不值得,不是因为我需要读得更清楚。请看我发布的答案,运行那个例子,自己看看。您决不能说Java中的对象是通过引用传递的。虽然当您将单个对象传递给函数时,它会给您一种错觉,即对象是通过引用传递的,而在Java中对象引用是通过值传递的。因为如果它们是通过引用传递的,那么对象的原始状态在main方法中也会发生变化,就像在swap方法中发生的那样,这是从未发生过的。您说的对象引用是通过值传递的,这是正确的。你说的对象在main方法中不会改变是错误的。通过引用传递的对象和通过引用值传递的对象之间的区别常常被忽略,因为这通常无关紧要。示例:
modify(SomeObj x){x=new SomeObj;}//x未在main中修改
modify(SomeObj x){x.stringMember=“一个新字符串!”;}//x的stringMember已修改
感谢您的澄清。我仔细阅读了Abu发表的文章,这篇文章很好地以图形方式解释了这一原则。因此,如果我得到了正确的结果,它会按值传递引用,除了在基元类型的情况下,在创建新引用时复制对象本身?再次感谢所有的答案,并帮助我理解这个相当基本的问题!伟大的社区。
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
****************************************