Я просто обновляю функции ООП 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 от Суперкласса...
Заранее спасибо....
Объекты имеют типы, и переменные имеют типы. Потому что вы положили:
Super sup = new Sub();
Теперь у вас есть переменная sup
типа Super
, которая ссылается на объект типа Sub
.
Когда вы вызываете метод на объекте, выполняемый метод выбирается на основе типа объекта, поэтому печатается "Sub", а не "Super".
Когда вы обращаетесь к полю в объекте, поле выбирается на основе типа переменной, вот почему вы получаете 5.
index - это просто поле, принадлежащее родительскому классу. Поскольку он принадлежит к родительскому классу, это означает, что он является атрибутом всех дочерних элементов. Проще говоря:
Класс Животное может иметь поле возраст и поле имя Все подклассы будут совместно использовать эти атрибуты, но будут иметь дополнительные поля, которые будут содержаться только в этих дочерних классах. Например, hairColour может быть единственным атрибутом класса Dog, но не класса Snake, который может иметь простой уникальный атрибут venomous
В этой структуре все Animal имеют имя, и возраст, который может определять животных в целом, и каждый вид имеет некоторые дополнительные атрибуты, уникальные для них, которые содержатся в их соответствующих подклассах.
В вашем коде это явно не показано, поскольку у вашего подкласса нет конструктора, да и вызова суперконструктора. Как объяснил Петар, ваш не закрытый атрибут index - это доступ из суперкласса
Это называется скрытием переменной экземпляра - ссылка . Обычно у вас есть две отдельные переменные, и поскольку тип ссылки Super
, он будет использовать переменную index
из Super
.
Это происходит потому, что функции привязываются во время выполнения, тогда как переменные привязываются во время компиляции.
Таким образом, переменные зависят от типа данных ссылки, в то время как функции зависят от значения, представленного типом данных ссылки.