доступ к переменным из метода main и другого
у меня есть класс А и наследуемый от него класс В
public class A {
int a = 5;
}
class B extends A {
}
Из мэйна доступ к b.a осуществляется без проблем
public class Main {
public static void main(String[] args) {
B b = new B();
System.out.println(b.a);
}
}
но стоит int a запрятать внутрь метода - их мэйна доступ к b.a уже не удается получить - cannot find symbol
public class A {
void method() {
int a = 5;
}
}
почему так просиходит?
Ответы (1 шт):
Потому что теперь a это локальная переменная метода method, а не переменная-член класса.
Если интересно, как оно под капотом работает, то изначально, когда a являлась переменной-членом, то память под неё выделялась внутри объекта и мы могли обратиться к данным, лежащим в этой области памяти на протяжении жизни объекта.
Когда же она была помещена внутрь метода класса, объект стал по размеру меньше (в нашем случае наверно 1 байт*), а вот при вызове указанного метода память под локальную переменную выделяется на стеке, а после выхода (если строго, то перед выходом :)) из функции освобождается (указатель на вершину стека возвращается в прежнее положение). Соответственно данные валидны лишь во время работы функции (а если строже, то немного меньше).
*: в С++ был бы 1 байт, так как пустые объекты недопустимы. Здесь, я думаю, так же, но могу ошибаться.