我对编程电路很陌生,我正在努力学习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())。
(编辑问题。枢轴关键字是无效的,不是静态的。我看到我已经教过这个概念(无效方法)和原始类型混淆了这个问题)
答案 0 :(得分:1)
我认为你正在寻找java的pass-by-value东西。看看这个article,您可能会理解代码中发生的事情背后的原因以及为什么它不能按照您的期望工作。
答案 1 :(得分:1)
对象通过引用传递,不会被复制。 Java通过引用而不是按值传递对象,因为您可能习惯于使用C语言。因此,您使用addComponentsToPane(frame.getContentPane());
传递的内容是对框架内容窗格的实际引用。
然后,静态方法使用该引用将按钮添加到实际内容窗格。没有复制对象是有充分理由的。想象一下,创建一个包含大量数据的类。每次将它传递给函数时复制这个类是没有意义的。
对于Java中的“原始”类型,例如“int”或“double”,有一个例外。这些方法的处理方式与您在C / C ++中学到的方法相同。但请记住,Integer和Double是类。
希望有所帮助!
答案 2 :(得分:1)
为了澄清@tzhechev,对象不是通过Java中的引用传递的,对象引用是通过Java中的值传递的,这在答案中是阿布所说的。为了进一步澄清这个话题,请看这个例子。
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
****************************************
虽然如果我只使用一个Object并在某种方法中修改它的内容,那么结果将是令人惊讶的。尝试下面的代码:
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
****************************************