Проблема Java Inheritance
При изучении вопросов scjp я столкнулся с таким поведением, которое я нашел странным.
Я объявил два класса Item и Bolt следующим образом:
class Item {
int cost = 20;
public int getCost() {
return cost;
}
}
class Bolt extends Item {
int cost = 10;
public int getCost() {
return cost;
}
}
и попытался дважды получить стоимость стоимости
public class Test {
public static void main(String[] args) {
Item obj = new Bolt();
System.out.println(obj.cost);
System.out.println(obj.getCost());
}
}
Выход, который я получаю, равен 20 10.
Я не понимаю, как это происходит.
Ответы
Ответ 1
obj
является ссылкой типа Item
, следовательно, первая 20, поскольку значение поля cost
Item
равно 20. Второе значение 10
, потому что тип времени выполнения obj
равен Bolt
и, следовательно, getCost()
вызывает getCost
класса Bolt
(так как Bolt
extends Item
).
Короче говоря, полиморфизм времени выполнения применим только к членам экземпляра (переопределение метода), а не к полям экземпляра.
Ответ 2
Поля полей не участвуют в игре полиморфизма. Методы.
Итак, когда вы обращаетесь к полю, вы переходите к тому, что определено в базовом классе, потому что тип объекта Item
. Когда вы вызываете метод, вы получаете фактическое значение, потому что вы вызываете метод с использованием полиморфизма.
Вывод:
Поля всегда закрыты. Если вы хотите получить доступ к методу записи поля.