Почему я могу объявить тип данных переменной дважды? - PullRequest
4 голосов
/ 30 января 2020

В коде ниже:

public class Square 
{
    private double side;

    public Square(double a) 
    {
        double side = a;
    }

    public double area()
    {
        return side * side;
    }

    public static void main(String[] args) 
    {
        Square r = new Square(10.0);
        System.out.println(r.area());
    }
}

Когда поле объявлено:

 private double side;

, а затем в конструкторе:

double side = a;

Почему ошибка не выдана?

Я бы так подумал, потому что мы объявляем тип данных переменной double дважды. Почему этот код выполняется?

Ответы [ 2 ]

6 голосов
/ 30 января 2020

Потому что второй объявляет переменную, локальную для конструктора. Он затеняет переменную-член (к которой вы все равно можете получить доступ через this.side).

В этом контексте это объявление совершенно бесполезно, так как эта переменная исчезнет, ​​как только закончится конструктор.

Кроме того, даже если бы это была проблема, она не выдаст ошибку времени выполнения. Это будет ошибка во время компиляции.

3 голосов
/ 30 января 2020

Объявление переменной включает в себя также объявление ее типа данных, поэтому вы, по сути, спрашиваете об объявлении одной и той же переменной дважды.

Вы правы, полагая, что объявление одной переменной дважды невозможно, но это не так происходит в вашем коде. Ваш

private double side;

является элементом данных объекта Square, то есть свойством квадратов. Он объявлен в блоке определения class, следовательно, он является элементом данных.

Ваша

double side = a;

- это локальная переменная, определенная в методе, который является конструктором в нашем дело. Синтаксически это законно, так как это , а не член Square и, следовательно, это не имеет никакого отношения к члену. Теперь, сказав, что я должен упомянуть, что вы допустили ошибку, так как внутри конструктора вы объявили переменную с тем же именем, что и ваш член данных, инициализировали локальную переменную и затем никогда не использовали ее, а в другом методе вы предполагаете что side инициализируется. Таким образом, вы почти наверняка намеревались инициализировать свой элемент данных в конструкторе, например:

public Square(double a) 
{
    this.side = a;
}

или даже

public Square(double a) 
{
    side = a;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...