Java - 按值传递

时间:2013-11-08 09:35:38

标签: java

我正在尝试使用Integer,输出让我感到非常震惊。

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);
  }
}

现在,Integerint的包装类,count是其对象,当我从count传递returnBool时,值{ count变为3,因此返回true,因为java传递的值为count,对象值也应在main方法中更改,但在main {{ 1}}打印0。

我想了解为什么会这样?

3 个答案:

答案 0 :(得分:11)

count++只是

的便利
count = Integer.valueOf(count.intValue()+1)

执行此操作后,您的本地变量count(在returnBool中)引用另一个对象,并且main方法中的局部变量始终指向初始对象。你没有实现传递参考。

对于Java语义,有两个类似的概念容易混淆:Java的对象引用的值传递(实质上是指针),以及真正的传递引用。你的例子强调了这种差异。

答案 1 :(得分:1)

Java通过Value传递类Integer而不是Reference。如果你想通过Reference传递它,你需要一个来自Apache Commons库的其他类,如org.apache.commons.lang.mutable.MutableInt

答案 2 :(得分:0)

java中没有pass-by-reference。方法参数按值传递,但该值可以是对象的引用。如果传递的对象是可变的,则对它的更改将影响方法外部的对象,因为该对象是相同的in和out。整数对象是不可变的。 您可以传递int [1]或AtomicReference或AtomicInteger或包含可变整数值的任何其他对象。

这是您的代码适用于AtomicInteger

public class CountB
{

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

    if (count.intValue() > 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();
   AtomicInteger count = new AtomicInteger(0);
   System.out.println(returnBool(w, count));
   System.out.println("Number of B and b: " + count);
  }
}