2014-10-09 2 views
-1

Я супер новичок в программировании, и я изучаю тест и не понимаю вывод части кода. Я надеялся, что вы поможете мне понять, почему 4 печатается в конце?Java, не может визуализировать вывод

Я выбросил код на сайт визуализации Java, и я все понимаю, кроме строки ... System.out.println (myScope.z); напечатал бы номер 4?

Любая помощь очень ценится!

public class ScopeTest { 
    int z; 

public static void main(String[] args){ 

    ScopeTest myScope = new ScopeTest(); 
    int z = 6; 
    System.out.println(z); 
    myScope.doStuff(); 
    System.out.println(z); 
    System.out.println(myScope.z); 
} 

void doStuff() { 
    int z = 5; 
    doStuff2(); 
    System.out.println(z); 
} 

void doStuff2() { 
    z=4; 
} 
} 

ответ

1

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

ScopeTest myScope = new ScopeTest(); 

Создайте локальную ссылочную переменную с именем myScope и инициализировать его на объект.

int z = 6; 

Создайте локальную переменную с именем intz и инициализировать его 6.

System.out.println(z); 

Распечатать значение локальной переменной z.

myScope.doStuff(); 

Вызов doStuff() на myScope объекта.

int z = 5; 

Создайте локальную переменную z в doStuff() и инициализировать его 5.

doStuff2(); 

Вызов doStuff2()

z=4; 

Установите в поле -членом Названный z к значению 4. И затем верните управление обратно до doStuff().

System.out.println(z); 

Распечатайте значение локальной переменной z. А затем верните управление обратно до main().

System.out.println(z); 

Распечатайте значение локальной переменной z. (Помните, что мы вернулись в main() прямо сейчас.

System.out.println(myScope.z); 

Наконец, распечатайте поле членаz. (Помните, его значение было установлено еще в doStuff2(). Это значение запоминается, потому что это z переменный член.)

+0

Вы, ребята, удивительный Tha! nks много, вы действительно помогли! – NoobCoderChick

2
  1. ScopeTest myScope = new ScopeTest(); инициализирует myScope.z к (значение по умолчанию)
  2. myScope.doStuff(); множеств myScope.z к и вызывает doStuff2()
  3. doStuff2() наборы myScope.z к .

Конечный результат будучи 4. Ключевым моментом является то, что местные z переменные, объявленные в main и doStuff() методов не имеют никакого отношения вообще на переменной z члена, объявленного в ScopeTest.

0

Вы вызываете метод dostuff() в main(), там вы инициализировали z = 5, который является его локальной переменной z, а не переменной класса z. поэтому вы вызываете dostuff2(), в котором вы находитесь , фактически изменяя переменную класса z = 4. Вот почему он печатает z = 4 в последнем syestem.out.println (z). Надеюсь, это поможет вам понять результат.

0

потому что в вашем коде z, объявленном в первой строке, является членом экземпляра (this).

так, когда-либо doStuff2() называется this.z установлен на 4.

//effectively void doStuff2() { this.z=4; }

переменные int z объявлены внутри методов main и doStuff() в local context.

и здесь это имеет значение только тогда, когда значение z в this контекста установлено окончательно (находится внутри doStuff2()). Таким образом,

System.out.println(z); >> prints value of local variable z declared in main System.out.println(myScope.z); >> prints the value of instance (of ScopeTest which is myscope here) member z

1

Это поток:

myScope.doStuff() -> 1 г = 5 2. doStuff2() -> г = 4

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