1

重複の可能性:
Javaは「参照渡し」ですか?

Javaでの参照により、オブジェクトをパラメーターとしてメソッドに渡す方法を知りたいです。このコードを試しました

public class Class1 
{
    public Class1()
    {
        String x = null;
        F(x);
        //x = null
        System.out.println("x = " + x);
    }

    void F(String x)
    {
        x = "new String";
    }

    public static void main(String[] args)
    {
        new Class1();
    }
}

関数Fにaを渡し、その中StringのStringの値を変更しているのがわかりますが、関数Fの外で行った変更はわかりません。このコードを実行すると、//{x = null}期待したものとは異なります。 //{x = new String}

4

5 に答える 5

9

オブジェクト自体は参照によって渡されますが、その参照は値によって渡されます。

これが意味することは、関数内のオブジェクトを変更できるということです。つまり、フィールドを変更したり、オブジェクトの状態を変更するメソッドを呼び出したりすることができます。

関数の参照を変更しようとしています。その参照は単なるコピーです。

Stringまた、不変型であることに注意してください。そのため、参照であっても、基になる を変更することはできませんObject

于 2012-09-14T17:44:37.090 に答える
2

Java オブジェクトは参照によって渡されます。オブジェクトを作成して参照(変数)に割り当てると、そのアドレスが割り当てられます。呼び出された関数でこれを変更すると、渡された同じオブジェクトが変更されます。しかし、あなたの場合、どのオブジェクトにも関連付けられていない null を渡しました。

明確なアイデアを得るには、私の例を参照してください。

public class Class1 {
public Class1() {
    StringBuffer x = new StringBuffer("Before");
    F(x);
    // x = null
    System.out.println("x = " + x);
}

void F(StringBuffer x) {
    x.append("After");
}

public static void main(String[] args) {
    new Class1();
}

}

于 2012-09-14T18:03:56.820 に答える
2

Java は、引数を参照ではなく値で渡します。図による説明については、別の質問に関する私の回答を参照してください。

ただし、次の方法で目的を達成できます。

1- 配列の使用:

public class Class1 
{
    public Class1()
    {
        String x = null;
        String[] holder = {x};
        F(holder);
        //x = null
        System.out.println("x = " + holder[0]);
    }

    void F(String[] holder)
    {
        holder[0] = "new String";
    }

    public static void main(String[] args)
    {
        new Class1();
    }
}

2- ラッパー クラスの使用:

class WrapperClass
{
    public String value;
}
public class Class1 
{
    public Class1()
    {
        String x = null;
        WrapperClass w = new WrapperClass();
        w.value = x;
        F(w);
        //x = null
        System.out.println("x = " + w.value);
    }

    void F(WrapperClass wrapper)
    {
        wrapper.value = "new String";
    }

    public static void main(String[] args)
    {
        new Class1();
    }
}
于 2012-09-14T17:54:15.200 に答える
1

Java の始まり以来、文字列は「特別な」種類のオブジェクトでした。それらはヒープ上に存在しますが、メモリを節約してパフォーマンスを向上させるために、JVM は同一の文字列の数を保持し、すべての参照が同じ値を持つ場所を指すようにします。ただし、これが機能するには、メモリ内の文字列が不変である必要があります (凍結されているため、変更できなくなります)。

別の方法は、関数が更新された値を返すようにコードを変更することです。

public class Class1 
{
    public Class1()
    {
        String x = null;
        x = F(x);
        //x = null
        System.out.println("x = " + x);
    }

    String F(String x)
    {
        return x = "new String";
    }

    public static void main(String[] args)
    {
        new Class1();
    }
}

しかし、何らかの理由で引数を渡していた可能性があります。これは、メソッドが新しい文字列を返す方法を説明するためのものです。

于 2012-09-14T21:04:44.683 に答える
0

スティングは変更できない不変であるため、それを行うことはできません.StringBufferを使用できます.mmutable.okです

class One
{
    One()
    {
        StringBuffer x =new StringBuffer("null");
        F(x);
        //x = null
        System.out.println("x = " + x);
    }

    void F(StringBuffer x)
    {
        x = x.delete(0,4);
        x=x.append("new string");   
    }

    public static void main(String[] args)
    {
        new One();
    }
}
于 2012-09-14T18:35:05.493 に答える