Я пошел «обновлять» свою Java, только чтобы понять, что, по-видимому, я не понимаю базовых понятий! Вот простой один я не могу понять:Java abstract class + inheritance - разрешение области или имени
public abstract class Robot {
private String model = "NONAME";
public Robot() {
System.out.println("Making a generic " + model + " robot, type: " + this.getClass());
}
public String getModel() {
return model;
}
}
OK, и подкласс:
public class Terminator extends Robot {
private String model;
public Terminator(String model) {
super();
System.out.println("Making a " + model + " terminator, type: " + this.getClass());
this.model = model;
}
}
И тогда я бегу простой пример, ожидая «T1000» для печати:
Robot r1 = new Terminator("T1000");
System.out.println(r1.getModel());
Нет кубиков! Печатается «NONAME». До этого, я получаю этот выход из конструкторов:
- Изготовление родовой NONAME робота, типа: класс com.akarpov.tutorial.Terminator
- Создание T1000 терминатор, типа: класс com.akarpov.tutorial.Terminator
Итак, хорошо, я вижу, что Java понимает, что экземпляр экземпляра моего класса - это Terminator, что и сказано в «новом». И, очевидно, экземпляр Terminator хранит копию модели == «T1000». Но, проверяя объект r1 в отладчике (IntelliJ), я вижу две переменные с именем «модель» на разных адресах (очевидно) с разными строками. И, очевидно, как показывает вывод, getModel в абстрактном классе выбирает значение по умолчанию, определенное в классе Robot, а не тот, который передается конструктору Terminator (и сохраняется внутри объекта).
Что я не понимаю об абстрактных классах и наследовании, и как бы я получил значение по умолчанию и поведение по умолчанию (т.е. getModel), которое собирает конкретные данные (т. Е. «T1000») в подкласс? Спасибо! И мои извинения, если это было рассмотрено много раз раньше - я выглядел, но на меня не набросилось.
Вы правы, конечно - это то, что я понял через 2 минуты после публикации. Я уже принял ответ, хотя, иначе я бы забрал твое! – alexakarpov