2014-02-16 4 views
0

При выполнении функции foo1, почему выход для этого кода будет: 15 и не 15 5?Aliasing в объектах

I underdtand, что указатель объекта v теперь указывает на объект va1, поэтому вывод для строки кода: System.out.print (v.getI() + ""); должно быть 15. Так почему же это 30?

public class Value 
{ 
    private int _i; 

    public Value() 
    { 
     _i=15; 
    } 

    public int getI() 
    { 
     return _i; 
    } 

    public void setI (int i) 
    { 
     _i=i; 
    } 

} 

public class TestValue 
{ 
    public static void foo1() 
    { 
     int i=5; 
     Value v= new Value(); 
     v.setI(10); 
     foo2(v,i); 
     System.out.print(v.getI() + " "); 
     System.out.print(i+ " "); 

    } 

    public static void foo2(Value v, int i) 
    { 
     v.setI(30); 
     i=10; 
     Value va1= new Value(); 
     v=va1; 
     System.out.print (v.getI() + " "); 
    } 

} 
+0

Возможный дубликат [Is Java «pass-by-reference»?] (Http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – Radiodef

ответ

1

Java поддерживает только передачу по значению. Поэтому, когда вы передаете объект «v» методу foo2, создается копия ссылки «v». Поэтому, когда вы устанавливаете V = знач1 в Foo2 копия справки, изменяется в foo2 не оригинальный эталонным «V» в Foo1.

+0

+1: Вы сказали это лучше, чем Я, поэтому я отбросил свой ответ. –

+0

«ссылки» Java, являющиеся значениями, действительно, действительно путают номенклатуру. Более интуитивно думать о них как о «ручках». – millimoose

+0

Спасибо @DonRoby миллимоз, да, это довольно запутанно изначально. –