Проблема наследования Java - PullRequest
14 голосов
/ 02 августа 2011

При изучении вопросов 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. Я не могу понять, как это происходит.

Ответы [ 2 ]

19 голосов
/ 02 августа 2011

obj является ссылкой типа Item, следовательно, первые 20, так как значение поля cost для Item равно 20. Второе значение 10, поскольку тип времени выполнения obj равен Bolt и, следовательно, getCost() вызывает getCost класса Bolt (поскольку Bolt расширяет Item).

Короче говоря, полиморфизм времени выполнения применим только к элементам экземпляра (переопределение метода) и неПоля экземпляра.

7 голосов
/ 02 августа 2011

Поля класса не участвуют в игре полиморфизма. Методы делают.

Итак, когда вы обращаетесь к полю, вы переходите к полю, определенному в базовом классе, потому что тип вашего объекта - Item. Когда вы вызываете метод, вы получаете фактическое значение, потому что вы вызываете метод, используя полиморфизм.

Вывод:

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

...