0

以下のようなコードがあり、呼び出されたInstance variablesクラスのクラスを交換していますFunctionSwapNames

public class Sam3 
{
    public String FirstName, LastName;

    public static void main(String[] args) 
    {   
        Sam3 objSam1 = new Sam3();
        Sam3 objSam2 = new Sam3();

        objSam1.FirstName = "Name1";
        objSam2.LastName  = "Name2";        

        System.out.print(objSam1.FirstName + " " + objSam2.LastName);

        SwapNames(objSam1, objSam2);

        System.out.print(objSam1.FirstName + " " + objSam2.LastName);
    }

    public static void SwapNames(Sam3 obj1, Sam3 obj2)
    {   
        Sam3 temp = obj2; 
        obj2 = obj1;
        obj1 = temp;

        obj1.FirstName = "First Name";
        obj2.LastName  = "Last Name";
    }
}

コードの出力は次のようになります

Name1 Name2
Name1 Name2

私が理解していないことは、値を交換したことですobj1 and obj2-それらへの参照classes。その後、値を変更しています。

コードが有効にならない理由。

返信ありがとう

4

3 に答える 3

2

Javaでは、すべてが値によって渡されます

SwapNames(objSam1, objSam2);referenceobjSam1を呼び出すと、メソッドパラメータとobjSam2にコピーされます。SwapNamesobj1obj2

したがって、との参照値を交換した後、obj1およびとobj2は交換されません。objSam1objSam2

objSam1objSam2古い参照オブジェクトを保持しています。したがって、それは何の影響も及ぼしません。


より明確にするために

Sam3 temp = obj2; 
obj2 = obj1;
obj1 = temp;

オブジェクトのFirstNameとLastNameの値を出力する場合。

System.out.print(obj1.FirstName + " " + obj2.LastName);

結果が表示されますName2 Name1

obj1が2番目のオブジェクトを参照しており、obj2が最初のオブジェクトを参照しているためです。

于 2013-02-19T18:41:54.650 に答える
1
public static void SwapNames(Sam3 obj1, Sam3 obj2)
{   
    Sam3 temp = obj2; 
    obj2 = obj1;
    obj1 = temp;

    obj1.FirstName = "First Name"; //<-- is actually objSam2 
    obj2.LastName  = "Last Name";  //<-- is actually objSam1
}

何が起こっているかを確認するには:

class Test{

    public int i=2;
}

public class Main {
public static void main(String[] args) {

    Test t1 = new Test();
    t1.i=0;

    Test t2 = new Test();
    t2.i=1;


    System.out.println(t1.i+" "+t1);
    System.out.println(t2.i+" "+t2);

    test(t1,t2);

    System.out.println(t1.i+" "+t1);
    System.out.println(t2.i+" "+t2);



}

public static void test(Test a, Test b){
    Test swap=a;
    a=b;
    b=swap;

    System.out.println(a.i+" "+a);
    System.out.println(b.i+" "+b);
}

}
/*
output:
0 Test@3c56b64c
1 Test@60da5686
1 Test@60da5686
0 Test@3c56b64c
0 Test@3c56b64c
1 Test@60da5686
*/
于 2013-02-19T18:46:19.743 に答える
0

コードには、Sam3 クラスのオブジェクトを含む 2 つの Sam3 オブジェクト参照変数
があります。

objSam1 の場合、Same3 の最初のインスタンス [Sam3
には FirstName と LastName の 2 つのインスタンス変数が含まれていることを思い出してください]
objSam1.FirstName = "Name1";
objSam1.LastName = null; // これは、設定または初期化しない場合のデフォルト値です

Sam3 の 2 番目のインスタンスである objSam2 の場合 [Sam3
クラスには 2 つのインスタンス変数 FirstName、LastName が含まれていることを思い出してください]
objSam2.FirstName = null; //これは、初期化しない場合のデフォルトです。 .FirstName
objSam2.LastName = "Name2";

スワップメソッドを呼び出した後、オブジェクトは変更されますが、

objSam2.FirstName = "First Name";を変更しています。
//以前は FirstName が null で、.LastName に変更はありません (上記のコードを参照)

objSam1.LastName
= "姓";
// 以前は null で、.FirstName に変更はありません (上記のコードを参照)

つまり、コンピューターは正しい答えを出しています。

于 2013-02-19T19:23:06.653 に答える