0

私は整数で何かをしようとしていましたが、出力が私を驚かせています。

public class CountB
{

  public static boolean returnBool(String w, Integer count)
  {
     for (int i = 0; i < w.length(); i++)
     {
         if (w.charAt(i) == 'B' || w.charAt(i) == 'b')
        {
       count++;
        }
     }

    if (count > 0)
      return true;
    return false;
   }

  // write the static method “isThisB” here
  public static void main(String[] args)
  {
    //  Scanner keyboard = new Scanner(System.in);
   //   System.out.println("Enter a string: ");
   String w = "fgsfbhggbB";//keyboard.nextLine();
   Integer count = new Integer(0);
   System.out.println(returnBool(w, count));
   System.out.println("Number of B and b: " + count);
  }
}

現在、Integerのラッパー クラスでありintcountそのオブジェクトであるため、countメインからに渡すとreturnBool、 の値countが 3 になるため、 が返さtrueれます。Java は値で渡されるため、countオブジェクトの値はmainメソッドでも変更される必要がありますが、 main count0 が出力されます。

なぜこれが起こっているのか理解したいですか?

4

3 に答える 3

11

count++便利なだけです

count = Integer.valueOf(count.intValue()+1)

この操作の後、ローカル変数count( 内returnBool) は別のオブジェクトを参照し、mainメソッド内のローカル変数は最初のオブジェクトを指し続けます。参照渡しを達成していません。

Java セマンティクスに関しては、混同しやすい 2 つの類似した概念があります。Java のオブジェクト参照 (本質的にはポインター) の値渡しと、真の参照渡しです。あなたの例は、この違いを強調しています。

于 2013-11-08T09:38:19.087 に答える
1

Java はクラス Integer を参照ではなく値で渡します。参照で渡したい場合はorg.apache.commons.lang.mutable.MutableInt、Apache Commons ライブラリのような他のクラスが必要です

于 2013-11-08T09:39:23.390 に答える