Почему вывод не такой же? - PullRequest
0 голосов
/ 06 апреля 2010

Выход на кулак System.out.println() отличается от второго System.out.println()
В чем может быть причина?

public class swapex{
    public static int var1, var2;

    public void badSwap(int var1, int var2){
        int temp = var1;
        this.var1 = var2;
        this.var2 = temp;
        System.out.println("var1 " + var1 + " var2 "+ var2);
    }

    public static void main(String args[])
    {
        swapex sw= new swapex();
        sw.badSwap(10,20);
        System.out.println("var1 " + var1 + " var2 "+ var2);
    }
}

Ответы [ 4 ]

8 голосов
/ 06 апреля 2010

Первый выводит значения параметров, второй выводит статические поля.

Давайте посмотрим на все значения соответствующих значений.

public void badSwap(int var1, int var2){

var1 и var2 - аргументы, передаваемые методу.

int temp = var1;

temp устанавливается на переданное в var1.

this.var1 = var2;

Статическое поле var1 устанавливается на переданное в var2. Это плохой стиль, потому что это излишне запутанно. Если у вас есть причина использовать статическое, напишите swapex.var1.

this.var2 = temp;

Опять же, статическое поле устанавливается.

System.out.println("var1 " + var1 + " var2 "+ var2);

Местные жители печатаются.

Вернуться на главную, строка:

System.out.println("var1 " + var1 + " var2 "+ var2);

разрешает статические поля, потому что нет переменных стека с этими именами. Опять же, это тоже плохой стиль. Вы бы использовали swapex.var1 и swapex.var2.

Таким образом, причина, по которой они печатаются по-разному, заключается в том, что вы сначала печатаете исходные несмененные аргументы, а затем заменяемые (обратные аргументам) статические поля.

1 голос
/ 06 апреля 2010

Переменные, которые вы устанавливаете в badswap, являются локальными аргументами, а не статическими членами swapex. Так как локальная область действия имеет приоритет, статические члены неизменны

Когда вы печатаете в первый раз, вы печатаете локальные аргументы, во второй раз вы печатаете статические элементы

чтобы оба были одинаковыми, измените имена аргументов на badswap ().

0 голосов
/ 06 апреля 2010

static поля относительно класса. Ключевое слово this обычно используется для различения локальной переменной с одинаковым именем и переменной класса. Рекомендуется избегать использования этого для ссылки на статические поля, поскольку это не нужно, но компилятор, кажется, принимает это.

Кроме того, var1 и var2 существуют только в области действия вашего метода badSwap (). Вот почему вы получаете другой результат. Sysout в методе отображает значения параметров, тогда как sysout в основном отображает значения переменных класса.

0 голосов
/ 06 апреля 2010
In the method badswap the var1 and var2 that 

печатается локальные переменные указанного метода, а именно

badswap ( int var1, int var2 )

and not that of class variables 

public static int var1, var2

и в этом причина различий.

...