Проблема 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. Когда вы вызываете метод, вы получаете фактическое значение, потому что вы вызываете метод с использованием полиморфизма.

Вывод:

Поля всегда закрыты. Если вы хотите получить доступ к методу записи поля.