Почему в функции-конструкторе допускается объявление ранее объявленных переменных?

Уважаемые 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 шт):

Автор решения: Maxgmer

По сути переменная - это значение по какому-то адресу в памяти. Название для переменных - это, можно сказать, упрощение для человека, которое в рантайме ничего не значит.

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

Почему это разрешает компилятор? Так решили разработчики Java, чтобы не нужно было мучаться с названиями и можно было использовать одинаковые в таких случаях. А для идентификации переменной, к которой обращается программист в таких случаях, добавили ключевое слово this, которое уже и поясняет компилятору, что мы стучимся в кучу к объекту, а не берем из стека в функции, например.

→ Ссылка