Понимание концепции наследования в Java - PullRequest
12 голосов
/ 16 июня 2010

Я просто обновляю функции упс в 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, Sub.

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

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

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

Ответы [ 5 ]

11 голосов
/ 16 июня 2010

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

8 голосов
/ 16 июня 2010

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

Super sup = new Sub();

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

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

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

2 голосов
/ 16 июня 2010

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

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

2 голосов
/ 16 июня 2010

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

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

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

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

0 голосов
/ 03 августа 2013

Когда мы присваиваем объект подкласса родительскому классу, объект общего родительского класса может принимать только общее свойство обоих классов, которое называется срезом объекта Вот почему значение патентного класса 5 печатается, только если это свойство, а не метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...