1

以下は、JAVAには参照渡しやアドレス渡しがないため、私が疑う余地のないコードです。では、メソッドの呼び出し後に出力が変化するのはなぜですか? また、メソッド呼び出し後の Java の内部メカニズムも知りたいですか?

class Language
{
    String languageID;
    String name;

    public Language(){}

    public Language(String id, String name)
    {
        this.languageID = id;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Language id-->" + languageID + " Name-->" + name;
    }
}

public class SwapDemo {
    public static void swap()
    {
        int a = 10, b= 5;
        System.out.println("Before Swap : A-"+a+" B-"+b);
        a = a+b;
        b = a-b;
        a = a-b;
        System.out.println("After Swap : A-"+a+" B-"+b);
        a = a^b;
        b = a^b;
        a = a^b;
        System.out.println("After Swap : A-"+a+" B-"+b);
    }

    public static void swap(Language e1, Language e2)
    {
        Language temp = new Language();
        temp = e1;
        e1 = e2;
        e2 = temp;
    }

    public static Language method(Language addit)
    {
        addit.name = "C++";
        addit = new Language();
        addit.name = "Harshal";
        return addit;
    }

    public static void main(String[] args) {
        Language l1 = new Language("1", "C");
        Language l2 = new Language("2", "Java");

        System.out.println("Before swap of employees");
        System.out.println("Language 1-----> "+l1.toString());
        System.out.println("Language 2-----> "+l2.toString());

        swap(l1, l2);
        System.out.println("After swap of employees");
        System.out.println("Language 1-----> "+l1.toString());
        System.out.println("Language 2-----> "+l2.toString());

        Language t = method(l1);
        System.out.println("Changing "+ l1.name);
        System.out.println("Changing "+ t.name);
    }
}
4

3 に答える 3

0

形

私はあなたの疑問を解消する次の行を説明しています. ヒープとスタックについて少し知っていると思います。

        Language t = method(l1);
        System.out.println("Changing "+ l1.name);
        System.out.println("Changing "+ t.name);

ここで、「l1」オブジェクトをメソッドに渡すと、 REFERENCEがオブジェクトに渡されます。REFERENCEは、 HEAP SPACE内のオブジェクトを識別するために使用される一種のハンドルです。

検討、

A a =new A();

ここで何が含まれますか?明らかに、新しく作成されたオブジェクトを指すアドレスです。

したがって、メソッドに OBJECT を渡すときは、オブジェクトが存在するメモリの場所への参照を渡します。ただし、メソッド内で swap(l1,l2) メソッドで行ったようにオブジェクトを他のオブジェクトに変更しようとすると、実際のオブジェクトではなくアドレスの値を変更しているため、失敗します

したがって、ステートメントaddit.name="C++" は、addit が指すメモリ位置にあるオブジェクトの内容を変更します。したがって、ここでは元のオブジェクトが変更されています。これで最初の疑問が解消されることを願っています。

2 番目の疑問については、オブジェクトはそのスコープ内に存在します。メソッド呼び出しがそのメソッドに割り当てられたすべての変数を超えるとすぐに、ガベージ コレクションの対象になります。しかし、ここで行っていることは、メソッドからオブジェクトへの参照を返していることです。したがって、オブジェクトを指す有効な参照があるため、オブジェクトはガベージ コレクションされません。したがって、2 番目の出力では、新しい値が出力されます。これが出力を理解するのに役立つことを願っています。

于 2013-05-16T10:36:23.727 に答える