Подтвердить что ты не робот

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

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

Спасибо заранее....

4b9b3361

Ответ 1

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

Super sup = new Sub();

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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