-1

重複の可能性:
Java、値渡し、参照変数

次の単純なJavaプログラムについて考えてみます。

class main{
          public static void main(String args[]){
                int x = 5;
                change(x);
                System.out.println(x);
          }
          static void change(int x){
             x = 4;
          }
 }

javaは値渡しを使用するため、xの値はメインで変更されません。この問題を克服するために、cで参照渡しの概念があります。しかし、javaでそのような概念は見つかりません。 xの値を変更します。xを変更する方法がない場合、これはJavaの欠点ではありませんか?

4

5 に答える 5

2

x内の呼び出し元コードのの値を変更することはできませんchange。(2つの異なる変数名を使用した方が明確だったでしょう。)Javaでの生活が難しくなるとは思いません。C#では参照渡しを使用できますが、それが良いアイデアになることはめったにありません。

通常、値渡しは理解しやすく、コードが単純になります。通常、メソッドで何かを単純に計算する(この場合は戻り値である必要があります)、オブジェクトを変更する必要がありますできれば、メソッドを呼び出すオブジェクトですが、パラメーターの1つに値で参照を渡すことによって示すオブジェクトである可能性があります。単純な割り当てを使用する以外に、呼び出し元のコードで変数の値を変更できることを非常にまれに望んでいます。

(ちなみに、Cにも参照渡しはありません。ポインターを値で渡すことができますが、それは同じではありません。)

于 2011-11-06T21:22:03.273 に答える
0

if you need to change a value using a method then don't use primitive data types...alternatively since you are using an int you could do this:

 class main{
          public static void main(String args[]){
                int x = 5;
                x = change(x);
                System.out.println(x);
          }
          static int change(int x){
             x = 4;
             return x;
          }
 }
于 2011-11-06T21:24:44.243 に答える
0

これを行う1つの方法は、宣言をメイン関数の外に移動してxクラスのスコープを指定することです。これにより、関数の変更を含め、クラスのすべてのメンバーがそのスコープを使用できるようになります。xを公開、保護、または公開クラスのメンバーにすることもできます。

class main{
      int x = 5;
      public static void main(String args[]){
            change(x);
            System.out.println(x);
      }
      static void change(int x){
         x = 4;
      }
}

したがって、すべてのオブジェクトのデフォルトのプライベートスコープは不利ではなく、まったく逆です。プログラマーが明示的に許可しない限り、意図しない変更による副作用を最小限に抑えます。

于 2011-11-06T21:34:51.610 に答える
0

C はまた、パラメータを値渡しします。ただし、ポインターを (ポインターの値によっても) 渡す場合は、ポインターが指す変数の値を変更できます。

関数内のポインターの値を変更することにより、C が値によってポインターを渡すことを確認できます。関数が戻るとき、ポインターは同じ場所を指しています (関数内で指している場所ではありません)。

値渡しは不利ではありません。関数やメソッドが引数の値を変更できないことが確実であれば、より安全だと感じます。

の値を変更する場合はx、次のコードを使用します。

x = change(x);

に変更void change(...)int change(...)ます。

于 2011-11-07T04:44:33.807 に答える
-2

基本的に、プリミティブは値によって渡され、オブジェクトは参照によって渡され、ポインターはありません。したがって、ラッパークラスを作成するか、新しい値を返します。

詳細については、http: //javadude.com/articles/passbyvalue.htmを参照してください。

于 2011-11-06T21:22:03.780 に答える