2

私はプログラミング回路にまったく慣れていないので、Java を体系的に学ぼうとしています。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())。

(質問が編集されました。ピボットキーワードは静的ではなく無効でした。問題を混乱させるプリミティブ型でこの概念(無効メソッド)を教えられたようです)

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
****************************************

ただし、オブジェクトを1つだけ使用し、そのコンテンツを何らかのメソッドで変更すると、驚くべき結果になります。その驚きのために次のコードを試してください:

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());のは、フレームのコンテンツ ペインへの実際の参照です。

次に、静的メソッドはその参照を使用して、実際のコンテンツ ペインにボタンを追加します。オブジェクトは正当な理由でコピーされません。たとえば、巨大なデータ配列を含むクラスを作成することを想像してみてください。関数に渡すたびにこのクラスをコピーするのは意味がありません。

「int」や「double」など、Java の「プリミティブ」型の場合は例外です。これらは、C/C++ で学んだのと同じように扱われます。ただし、Integer と Double はクラスであることに注意してください。

それが役立つことを願っています!

于 2012-11-03T12:28:26.937 に答える