Инициализация и объявление переменной в конструкторе в Java - PullRequest
0 голосов
/ 22 сентября 2019

В приведенном ниже коде я создаю и присваиваю значение a в конструкторе.

Я знаю, как обновить значение a. (Используя a = 2 вместо int a = 2)

что происходит с этим новым значением a в программе и, если мне нужно, как получить к нему доступ?

public class Consttest{
    int a = 12;
    Consttest(){
        int a = 2; // where is this gone?
    }
    public static void main(String[] args){
        Consttest test = new Consttest();
        System.out.println(test.a); // a=12
    }
}

Ответы [ 3 ]

0 голосов
/ 22 сентября 2019

когда вы создаете переменную внутри любого метода.Это остается в силе до объема метода.когда метод будет завершен, он будет уничтожен (удален из стека).

  public class Consttest{
        int a = 12;
        Consttest(){
            a = 2; //change this line like this.
        }
        public static void main(String[] args){
            Consttest test = new Consttest();
            System.out.println(test.a); // a=12
        }
    }
0 голосов
/ 22 сентября 2019

Это известно как переменное затенение.

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

Переменная, объявленная на уровне класса - поля, доступные на уровне класса и уровне метода.

Переменная, объявленная на уровне метода, доступна только из метода.Вы можете объявлять переменные на разных уровнях с одинаковыми именами.

Переменная, объявленная в методе с тем же именем, что и переменная уровня класса, имеет больший приоритет над переменной экземпляра, поэтому компилятор использует эту переменную.Это теневое копирование

Конструктор - это особый метод.

public class Consttest{
    int a = 12; // instance level scope, can be 'seen' at the class level or method level
    Consttest(){
        int a = 2; // where is this gone? - this is declared at the method level which shadows the instace variable a
    }
    public static void main(String[] args){
        Consttest test = new Consttest();
        System.out.println(test.a); // a=12
    }
}

Когда вызывается метод, создается новый стековый фрейм.Когда метод возвращает этот стековый фрейм, он выталкивается из стека, и любые переменные, созданные в стековом фрейме, разыменовываются, если только вы не передадите ссылку на объект, поэтому в ответ на вопрос, куда он идет?- Это ушло.

0 голосов
/ 22 сентября 2019

Вы переопределяете переменную на уровне конструктора.Если вы хотите присвоить значение переменной, просто не создавайте ее заново.

public class Consttest{
    int a = 12;
    Consttest(){
        this.a = 2;
    }
    public static void main(String[] args){
        Consttest test = new Consttest();
        System.out.println(test.a); // a=2
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...