2014-02-16 2 views
1
class OpenSource { 
    private int x; 

    public OpenSource(int x) { 
     this.x = x; 
    } 

    public void setX(int x) { 
     this.x = x; 
    } 

    public int getX() { 
     return x; 
    } 

    static OpenSource Open(OpenSource opensource) { 
     opensource = new OpenSource(100); //line 19 
     return opensource; 
    } 

    public static void main(String a[]) { 
     OpenSource open = new OpenSource(300); //line 24 
     System.out.println(open.getX() + "."); 
     OpenSource opensource = Open(open);  //line 26 
     System.out.println(open.getX() + "."); 
     System.out.println(opensource.getX() + "."); 
     open = Open(opensource); 
     System.out.println(open.getX() + "."); 
     System.out.println(opensource.getX()); 

    } 

} 

// почему выход дает 300 300 100 100 100 Почему не 300 100 100 100 100, где я ошибаюсь? Я нарисовал представление, как показано ниже, чтобы понять его. Problem 1Не удалось проследить, что случилось с моим ответом

+0

См. Также http://stackoverflow.com/questions/40480/is-java-pass-by-reference –

ответ

0

Внутри вашей функции Open у вас есть эта строка:

opensource = new OpenSource(100); //line 19 

Но opensource переменной здесь действительно только копия о местоположении объекта, который был принят. Изменение копии местоположения не изменяет местоположение оригинала, это не то, что вы можете сделать на Java.

Давайте посмотрим на эту немного более простой пример:

public static Integer addOne(Integer in) { 
    in = in + 1; 
    return in; 
} 

// ... sometime later 
Integer three = Integer.valueOf(3); 
Integer four = addOne(three); 

В этом примере, мы ожидаем, что переменная three только когда-либо удерживать значение 3, даже если внутри addOne мы изменяем переменную in, мы не обновляя переменную three, только обновляя копию переменной three, называемую in.

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