Помогите понять код
имеем код
public class Test {
static int var3 = 1;
public static void test(int var3) {
var3 += 3;
}
public static void test2() {
var3 += 3;
}
public static void main(String[] args) {
test(Test.var3);
System.out.println(var3);
test2();
System.out.println(var3);
}
}
вывод : 1 4
как так получается, что передав в метод test поле класса Test.var3 , она не меняеться.
но, если изменить сигнатуру метода public static void test(int var3)
на public static void test(int a) то меняеться.
Ответы (1 шт):
При записи (int var3) внутри метода создаётся локальная переменная с именем var3 которая никак не является ссылкой на свойство класса. В себе она содержит копию значения, переданного в метод. Поэтому в теле метода вы уже оперируете именно этой внутренней переменной.
При записи (int a) метод уже работает с переменной самого класса.
Именно поэтому часто в конструкторах, чтобы отличить аргументы, переданные внутрь и свойства самого класса пишут так:
....(int param1, int param2) {
this.param1 = param1;
this.param2 = param2;
}
Чтобы чётко компилятору дать знать что есть свойство класса, а что переменная метода. Иначе он просто не знает что из них что и работает с аргументом в локальном скоупе.