1

かなり基本的なJavaコードを理解するのに苦労しています.x = 2をコンパイルする方法がわかりません. 私のロジックでは4である必要があるためです。コード自体:

public class eksami_harjutused {

public static int x=2;
   public static int y=2;  

   public static void main(String[] args) {     
     foo(bar(foo(x)));      
     System.out.println("main x,y: "+x+" "+y);
   }  

   public static int foo(int x) {     
     x++;
     y++;   
     System.out.println("foo x,y: "+x+" "+y);
     return x;
   }

   public static int bar(int x) {
     int z=0, y=10, u=0;    
     --y;
     for(y=1; y<(x*x); y++) {
       for(z=1; z<x; z++) { 
         u++;
       }
     }
     System.out.println("bar x,y: "+x+" "+y);
     return z;       
   }           
}

次のように出力されます。

フー x、y: 3 3

バー x、y: 3 9

フー x,y: 4 4

メイン x、y: 2 4

4

2 に答える 2

5

まあ、x値で渡されます-それはint型であるため、呼び出し先関数での変更xは呼び出し元関数には影響xしません。呼び出し先に値のコピーを渡すことを考えることができます。呼び出し先は、呼び出し元のスコープにx影響を与えることなく、それで何でもできます。x

値渡しは、Java のすべてのプリミティブ型に対して行われます。そして、参照渡しは残りに対して行われます (オブジェクト - 配列がオブジェクトであることに注意してください)。

もう 1 つのことは、fooand barmethods:の変数シャドウイングの効果です: はandxへのパラメーターとして宣言されているため、クラス メンバーはシャドウされます。inおよびメソッドへのアクセスは、クラス メンバーではなく、渡された引数を参照します。foobarxxfoobarx

xメソッドで表示されるの値は、プログラムの実行中に決して触れられないmainクラス メンバーから取得されます。x

対照的に、メソッドyへの 2 回の呼び出しで変数が 2 回変更されていることがわかります。これは、 inメソッドがクラス メンバーを参照するためです。ただし、 inメソッドは、メソッドで宣言されたローカル変数を参照します。fooyfooyybarybar

于 2013-01-12T15:50:03.010 に答える
0

intは値によって渡されるため、foo()でxがインクリメントされることは期待できません。Integerクラスも不変であるため、org.apache.commons.lang.mutable.MutableIntを試すことができます。

于 2013-01-12T15:53:48.643 に答える