Разве это не противоречит правилам статических переменных? - PullRequest
0 голосов
/ 16 октября 2019

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

public class FinalKeyWord {

    final int age;
    static int name;

    {
        ran();
        displayName();
    }


    public FinalKeyWord() {
        this.age = 10;
    }

    public FinalKeyWord(int a){
        this.age = a;
    }

    void ran(){
        Random r = new Random();
        int rand = r.nextInt(6);
        System.out.println(rand);
        name = rand;
    }

    public void displayAge() {
        System.out.println("This is final " + age);
    }

    public void displayName() {
        System.out.println("This is static " + name);
    }

    public static void main(String[] args) {

        FinalKeyWord a = new FinalKeyWord();
        //a.displayAge();
        //a.displayName();
        FinalKeyWord a2 = new FinalKeyWord(35);
        //a2.displayName();

    }

}

Вывод:

    This is static 2 \n
    This is is static 3

Ответы [ 2 ]

1 голос
/ 16 октября 2019

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

0 голосов
/ 16 октября 2019

Из Документация по Java / учебные пособия ,

Методы экземпляра могут напрямую обращаться к переменным класса и методам класса.
Так что это совершенно законно,

public class FinalKeyWord {

    static int a = 5;

    void change() {
        a= 10;
    }

    public static void main(String[] args) {
        FinalKeyWord obj = new FinalKeyWord();
        System.out.println(a);
        obj.change();
        System.out.println(a);
    }
}

И напечатает,

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