Понимание понятия наследования в Java

Я просто обновляю функции ООП Java. Так, у меня есть немного беспорядка относительно понятия наследования. Для этого у меня есть следующий пример кода:

class Super{
    int index = 5;
    public void printVal(){
        System.out.println("Super");
    }
}
class Sub extends Super{
    int index = 2;
    public void printVal(){
        System.out.println("Sub");
    }
}
public class Runner {
    public static void main(String args[]){
        Super sup = new Sub();
        System.out.println(sup.index+",");
        sup.printVal();
    }
}

Теперь выше кода дает мне вывод как: 5, Замена

Здесь, мы переопределяем printVal () метод, так, чтобы было понятно, что он получает доступ к методу дочернего класса только.

Но я не мог понять, почему это получает доступ к значению x от Суперкласса...

Заранее спасибо....

12
задан Donal Fellows 16 June 2010 в 10:19
поделиться

4 ответа

Объекты имеют типы, и переменные имеют типы. Потому что вы положили:

Super sup = new Sub();

Теперь у вас есть переменная sup типа Super, которая ссылается на объект типа Sub.

Когда вы вызываете метод на объекте, выполняемый метод выбирается на основе типа объекта, поэтому печатается "Sub", а не "Super".

Когда вы обращаетесь к полю в объекте, поле выбирается на основе типа переменной, вот почему вы получаете 5.

8
ответ дан 2 December 2019 в 06:44
поделиться

index - это просто поле, принадлежащее родительскому классу. Поскольку он принадлежит к родительскому классу, это означает, что он является атрибутом всех дочерних элементов. Проще говоря:

Класс Животное может иметь поле возраст и поле имя Все подклассы будут совместно использовать эти атрибуты, но будут иметь дополнительные поля, которые будут содержаться только в этих дочерних классах. Например, hairColour может быть единственным атрибутом класса Dog, но не класса Snake, который может иметь простой уникальный атрибут venomous

В этой структуре все Animal имеют имя, и возраст, который может определять животных в целом, и каждый вид имеет некоторые дополнительные атрибуты, уникальные для них, которые содержатся в их соответствующих подклассах.

В вашем коде это явно не показано, поскольку у вашего подкласса нет конструктора, да и вызова суперконструктора. Как объяснил Петар, ваш не закрытый атрибут index - это доступ из суперкласса

2
ответ дан 2 December 2019 в 06:44
поделиться

Это называется скрытием переменной экземпляра - ссылка . Обычно у вас есть две отдельные переменные, и поскольку тип ссылки Super , он будет использовать переменную index из Super .

11
ответ дан 2 December 2019 в 06:44
поделиться

Это происходит потому, что функции привязываются во время выполнения, тогда как переменные привязываются во время компиляции.

Таким образом, переменные зависят от типа данных ссылки, в то время как функции зависят от значения, представленного типом данных ссылки.

2
ответ дан 2 December 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: