Приоритетность переменных

Я только начал изучать Джаву и у меня появилась первая непонятка. Записал в переменную newAge число, которое зависит от переменной age. Проблема состоит в том, что у меня переменная newAge равна 0. Я подумал что проблема была в том, что эту переменную я написал в самом начале, и по этому я определил ее после геттеров и сеттеров, но она и так равна 0. Посмотрел через gdb и понял, что почему-то компилятор начинает считывать ее первой (хоть она почти в самом конце). Что это за фишка Джавы, и как с ней бороться? Заранее всем спасибо!

Код:

public class Training {
    public static void main(String[] args) {
        Encapsulation enc = new Encapsulation();
        enc.setAge(24);
        enc.setName("Ruslan");
        enc.hello();
    }
}

class Encapsulation {
    private int age;
    private String name;

    public void setAge(int userAge) {
        age = userAge;
    }
    public int getAge() {
        return age;
    }
    public void setName(String userName) {
        name = userName;
    }
    public String getName() {
        return name;
    }
    private int newAge = 65 - age;

    public void hello() {
        System.out.println("Hello my friend! My name is " + name + " and I am " + age + " years. And my age to retire is " + newAge + "!");
    }
}

Программа выводит следующее:

"Hello my friend! My name is Pasha and I am 18 years. And my age to retire is 65!"


Ответы (2 шт):

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

При создании объекта new Encapsulation(), значение age=0, соответственно, newAge=65. Метод setAge() срабатывает ровно тогда, когда вы его вызываете

 Encapsulation enc = new Encapsulation(); // newAge = 65 - 0
 enc.setAge(24);
 enc.setName("Ruslan");
 enc.hello();
→ Ссылка
Автор решения: MaxLevs

Это не "зависимая" переменная, ты прописываешь для поля параметр по умолчанию. Вычисляется это единожды - во время вызова конструктора. На данном этапе поле age не определено.

Можно пойти двумя путями. Во-первых, пересчитывать newAge при вызове сеттера для age.

private int age;
private int newAge;

public void setAge(int age) {this.age = age; this.newAge = 65 - age;}
public int getAge() {return age;}
public int getNewAge() {return newAge;}

Во-вторых, можно сделать геттер для newAge, в котором высчитывать newAge динамически.

private int age;

public void setAge(int age) {this.age = age;}
public int getAge() {return age;}
public int getNewAge() {return 65 - age;}

Второй вариант мне нравится больше, так как позволяет лучше реагировать на непредвиденные обстоятельства. Например, отсутсвие инициализации age.

→ Ссылка