В чем проблема с параметрами в конструкторе класса в Java? - PullRequest
0 голосов
/ 14 ноября 2018

В этом коде, если я оставлю int i в параметризованном конструкторе, он выдаст ошибку.Если что-то кроме int i работает нормально.

Пример: int j работает нормально.В чем причина этой ошибки, пожалуйста, просветите мои знания.

//this program throws an error
class X
{ 
    final int i;
    X()
    {
        i = 0;
    }
    X(int i)//need to keep other than i
    {
        i = 20;
    }
}

//this program works fine
class X
{ 
    final int i;
    X()
    {
        i = 0;
    }   
    X(int j)
    {
        i = 20;
    }
}

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

In

X(int i)
{
    i = 20;
}

Локальная переменная i (аргумент конструктора) скрывает переменную экземпляра i.Поэтому i = 20; изменяет локальную переменную, а не переменную экземпляра final с тем же именем, которая остается неинициализированной.

Эту проблему можно избежать с помощью:

X(int i)
{
    this.i = 20;
}

или

X(int i)
{
    this.i = i;
}
0 голосов
/ 14 ноября 2018
class X
{ 
    final int i;
    X()
    {
        i = 0;
    }

То, что вы говорите выше, это то, что ваш i равен 0, если параметры не заданы. Это то же самое, что сказать i=0 или this.i=0. То же самое, что есть только один i, поэтому this на самом деле не нужен.

С другой стороны, ниже, есть 2 экземпляра i, поэтому вам нужно убедиться, что Java знает, какой из них какой. В этом случае представьте, что вы хотите равняться i из X, равному i, переданному в качестве параметра: this.i=i; - это то, что вы искали. «Мой i класса должен быть i, переданным в качестве параметра.

Так что в этом случае, если ваш конструктор получает int, он должен дать ВАШЕМУ i значение 20. Если ваш параметр был j, так как j не определен в вашем классе, он принимает i как i вашего класса. Но имея 2 i, вы должны убедиться, какой из них какой!

 X(int i)//need to keep other than i
    {
//the i of my class should be 20. remember! this.i=i if you want the i of your class to be equal to the parameter passed i
            this.i = 20;
        }
    }
0 голосов
/ 14 ноября 2018

В приведенном выше коде вы никогда не инициализируете переменную final int i, что должно быть либо сделано при объявлении этой переменной, либо в конструкторах вашего класса, даже если вы делаете i = 20;, вы ссылаетесь на int i, который является частью параметров этого метода.

Если вы хотите изменить значение final int i и иметь параметр с именем i в своем методе, вы должны вызвать this.i = 20;, и оно будет исправлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...