2013-10-28 1 views
0

Поскольку мой предыдущий вопрос Java method invocation orderвызов метода порядка с объектом Java ссылки

Если мой код изменяет

public class MyClassTest { 

    private static MyClass m = new MyClass(10); 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     m.initMe(getint()); 
    } 

    public static int getint() { 
     m = new MyClass(20); 
     return 40; 
    } 
} 

class MyClass { 
    private int i; 

    public MyClass(int i) { 
     this.i = i; 
    } 

    void initMe(int i) { 
     System.out.println(this.i); 
    } 
} 

Мой выходной 10 не 20 вызывает Java является передача по значению правой? Таким образом, также имеет значение, что порядок вызова метода также зависит от выравнивания объекта с типом времени выполнения.

+2

Что, черт возьми, вы пытаетесь здесь сделать? –

ответ

0

m.initMe(getint()); Он инструктирует вызвать метод объекта, на который ссылается m.

Теперь, если m ссылается на новый объект между выполнением, хотя команда будет определенно вызывать метод старого объекта. И как только это будет сделано, объект будет недоступен, а также будет собрано мусор.

-1

Это то, что происходит, когда выполняется нижняя строка.

m.initMe(getint()); 

m, который ссылается на объект, содержащий 10 значение используется для вызова метода initMe(). Теперь после вызова initMe(), вы делаете m ссылку на новый объект в методе getint().

Но так как initMe() был вызван до нового назначения, this.i возвращает 10 вместо 20.

После этого пункта m ссылается на новый объект, который имеет значение i как 20. Если вы добавите еще одну строку m.initMe(getint()); после первого утверждения, вы получите со второго выполнения инструкции.


Так это также важно, что порядок вызова метода также влияет ссылка на объект выравнивать с типом исполнения

Таким образом, ответ Да, порядок имеет значение.

+0

Downvoter - Запомните, почему вы не согласны со мной ?! – SudoRahul

0

Вы видите, здесь вы создаете новый MyClass со значением 10:

private static MyClass m = new MyClass(10); 

теперь this.i является 10, потому что, ну, вы сказали, что должно быть 10.

Причина не возвращает 20, потому что, когда вы звоните:

m.initMe(getint()); 

он вернется 10, потому что это было присвоено значение m в момент initMe() вызова.


Если вы сделаете это:

public static void main(String[] args) { 
     m = new MyClass(20); 
     m.initMe(getint()); 
    } 

    public static int getint() { 
     return 40; 
    } 

вы получите: 20, потому что теперь вы присвоили значение 20 к объекту до выполнения initMe().


Интересно, что если вы сделаете это:

public static void main(String[] args) { 
     m.initMe(getint()); 
     m.initMe(getint()); 
    } 

    public static int getint() { 
     m = new MyClass(20); 
     return 40; 
    } 

вы получите:

10 
20 

, потому что при первом запуске, то значение будет 10, но m было присвоено значение 20, а для следующего прогона, перед выполнением, он будет содержать значение 20.

0

Как вы ответили на предыдущий вопрос, JVM - это машина на основе стека. Сначала запустите статический раздел, где инициализированный экземпляр MyClass (10). После этого выполняются main(), где экземпляр MyClass (10) будет перенесен в стек операнда (0: getstatic #2). После этого будет выполнен getint(), где будет создан новый экземпляр MyClass (20) (6: invokespecial #6) и установите новое статическое поле (9: putstatiC#2), но в стеке операнд по-прежнему остается старым значением (MyClass (10)).

static {}; 
Code: 
    0: new   #5     // class MyClass 
    3: dup 
    4: bipush  10 
    6: invokespecial #6     // Method MyClass."<init>":(I)V 
    9: putstatic  #2     // Field m:LMyClass; 
    12: return 
LineNumberTable: 
    line 3: 0 

public static void main(java.lang.String[]); 
    Code: 
    0: getstatic  #2     // Field m:LMyClass; 
    3: invokestatic #3     // Method getint:()I 
    6: invokevirtual #4     // Method MyClass.initMe:(I)V 
    9: return 
    LineNumberTable: 
    line 7: 0 
    line 8: 9 

public static int getint(); 
    Code: 
    0: new   #5     // class MyClass 
    3: dup 
    4: bipush  20 
    6: invokespecial #6     // Method MyClass."<init>":(I)V 
    9: putstatic  #2     // Field m:LMyClass; 
    12: bipush  40 
    14: ireturn 
    LineNumberTable: 
    line 11: 0 
    line 12: 12 
Смежные вопросы