Приоритетность переменных
Я только начал изучать Джаву и у меня появилась первая непонятка. Записал в переменную 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 шт):
При создании объекта new Encapsulation(), значение age=0, соответственно, newAge=65. Метод setAge() срабатывает ровно тогда, когда вы его вызываете
Encapsulation enc = new Encapsulation(); // newAge = 65 - 0
enc.setAge(24);
enc.setName("Ruslan");
enc.hello();
Это не "зависимая" переменная, ты прописываешь для поля параметр по умолчанию. Вычисляется это единожды - во время вызова конструктора. На данном этапе поле 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.