我正在尝试使用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);
}
}
现在,Integer
是int
的包装类,count
是其对象,当我从count
传递returnBool
时,值{ count
变为3,因此返回true
,因为java传递的值为count
,对象值也应在main
方法中更改,但在main
{{ 1}}打印0。
我想了解为什么会这样?
答案 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);
}
}