Почему в функции-конструкторе допускается объявление ранее объявленных переменных?
Уважаемые senior'ы и к ним стремящиеся, подскажите, пожалуйста, новичку почему компилятор в принципе допускает такой код?
public class Cat {
String name;
int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {}
}
Ведь по сути, внутри функции-конструктора, на время работы этой самой функции, объявляются переменные-параметры, значения которых ниже присваиваются переменным this экземпляра класса. Конечно, это могут быть и:
public Cat(String s, int a) {
this.name = s;
this.age = a;
}
И это ОК. Но почему компилятор допускает повторную инициализацию переменных с теми же именами (name, age) в первом коде?
...
String name;
int age;
public Cat (String name, int age) {
...
}
...
Чего я не понимаю?
Ответы (1 шт):
По сути переменная - это значение по какому-то адресу в памяти. Название для переменных - это, можно сказать, упрощение для человека, которое в рантайме ничего не значит.
Переменные в параметрах конструктора и переменные у объекта Cat, хоть и могут называться одинаково, но будут храниться в разных местах в памяти и для компьютера ничего общего не имеют, тк хранятся по разным адресам в памяти. Названия нужны лишь для того, чтобы программист понимал, что делает.
Почему это разрешает компилятор? Так решили разработчики Java, чтобы не нужно было мучаться с названиями и можно было использовать одинаковые в таких случаях. А для идентификации переменной, к которой обращается программист в таких случаях, добавили ключевое слово this, которое уже и поясняет компилятору, что мы стучимся в кучу к объекту, а не берем из стека в функции, например.