2014-02-07 3 views
2

Я читал эту тему: Is Java "pass-by-reference" or "pass-by-value"?, и я попытался запустить пример из этого ответа: https://stackoverflow.com/a/73021/2838739. Фактически значение myDog было изменено вне этого метода. Тогда я попытался сделать то же самое с Integer. Я был удивлен, потому что его ценность не изменилась. Может ли кто-нибудь объяснить мне, почему?Передача ссылки на метод Integer на Java

Мой тестовый код:

package testtest; 

class Dog { 

    String name; 

    public Dog(String name) { 
     this.name=name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

public class Main { 

    public static void main(String[] args) { 

     Dog myDog = new Dog("Rover"); 
     System.out.println(myDog.getName()); 
     foo(myDog); 
     System.out.println(myDog.getName()); 

     Integer i = 5; 
     changeValue(i); 
     System.out.println(i); 
    } 

    public static void changeValue(Integer i) { 
     i = 50; 
    } 
    public static void foo(Dog someDog) { 
     someDog.setName("Max");  // AAA 
     someDog = new Dog("Fifi"); // BBB 
     someDog.setName("Rowlf"); // CCC 
    } 

} 

И выход был:

Rover

Макс

Спасибо заранее.

+1

"Java всегда проходят по значению." - от самого проголосовавшего ответа. Однако он работает *** немного *** с объектами (поверх примитивных типов данных). Вот почему объекты работают почти как pass-by-reference. Решение объясняет это. –

+0

Кто-то, вероятно, сможет описать это лучше, но в Java при назначении объекта Integer с примитивным значением 'int' он автоматически создает новый объект Integer, значение которого является примитивным' int '. Таким образом, в этом случае 'i' получает новую ссылку на объект внутри' changeValue() ', а' i' в 'main()' остается нетронутой. – jonhopkins

+0

Какая часть связанного вопроса и ответов вы не понимаете? –

ответ

4

Целое число не является изменяемым классом. (На нем нет метода set.) Вы можете указать старую переменную на другое целое число, но это не изменит целое число, которое вы передали методу.

0

Целое - это примитивный тип данных. Вы не можете изменить их внутри методов.

Если вы передадите объект методу, вы можете изменить его доступные переменные-члены.

В Java существуют специальные классы-оболочки для примитивных типов, таких как Integer для int, Character for char и т. Д., И даже если они похожи на объекты, вы также не можете изменять их значения внутри методов. Это единственное исключение, которое я знаю.

0

Как уже указывалось, уже примитивные типы передаются по значению. Но если вам действительно нужно передать примитивы по ссылке, вы можете использовать массив.

public class PassByRefMain { 

    public static void main(String[] args) { 
     PassByRefMain m = new PassByRefMain(); 
     int[] number = new int[]{5}; 
     System.out.println(number[0]); 
     m.changevalue(number); 
     System.out.println(number[0]); 
    } 

    public void changevalue(int [] number){ 
     number[0] = 9; 
    } 
} 

Выход будет

5 
9 
Смежные вопросы