2013-11-08 5 views
0

Я пытался что-то с помощью Integer, и выход меня волновал.Java - pass by value

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 метод также, но в maincount отпечатки 0.

Я хочу понять, почему это происходит?

+5

Java всегда [** передача по значению **] (http://stackoverflow.com/q/40480/2024761) (Период) – SudoRahul

+4

'Integer 'объекты неизменяемы. Всякий раз, когда вы думаете, что можете изменить значение «Целое», то, что вы делаете, становится новым. –

+0

Вы должны просто вернуть счет. Java не поддерживает pass by reference, никогда не имеет. Вы можете имитировать его, но он уродлив, и я предлагаю вам прочитать ответы, приведенные в последнем вопросе, который показывает вам, как вы должны это делать. –

ответ

11

count++ просто удобство для

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

После этой операции, ваша локальная переменная countreturnBool) относится к другому объекту, а локальная переменная в методе main продолжает указывать на начальный объект. Вы не достигли пропущенных ссылок.

Что касается семантики Java, то есть две аналогичные концепции, которые легко путать: пропуская значение Java-ссылок на объекты (по сути, указатели) и истинные передачи по ссылке. Ваш пример подчеркивает эту разницу.

+0

Я думаю, что tere не проходит по ссылке в Java! – ktaria

+1

Вы правильно думаете: нет. –

+0

Решение состоит в том, чтобы создать класс с Integer в нем и передать класс методу. В методе переопределить/обновить ссылку Integer внутри класса. При выходе из метода класс будет содержать новый объект Integer. – Enigma

1

Java передает класс Integer по значению, а не по ссылке. Если вы хотите передать его по ссылке, вам понадобится другой класс, например org.apache.commons.lang.mutable.MutableInt, из библиотеки Apache Commons

+0

Фактически он передает значение Reference по значению. Ссылка обновляется внутри метода, но исходная ссылка вне класса по-прежнему ссылается на старый объект. – Enigma

+0

ОК, спасибо за информацию. Я знаю только, что класс Java Integer является неизменным. – bluelDe

+0

Или вы можете передать 'int [] count = {0};' –

0

В java нет пропущенного ссылки. Параметры метода передаются по значению, но это значение может быть ссылкой на объект. Если переданный объект изменен, изменения на нем будут влиять на объект вне метода, поскольку объект тот же, что и в. Целочисленные объекты неизменяемы. Вы можете передать 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); 
    } 
} 
Смежные вопросы