Как на самом деле работает апкастинг в Java

У меня есть 3 класса, где один super class и два других sub classes, У них есть print() распространенный в них метод. Во время звонка print() методы из main() Я выложил объекты в super class тогда разве это не должно вызывать метод super class скорее, чем subclasses, Я здесь немного запутался. Как это возможно? Есть ли причина для такого поведения в Java.

Вот мой код

class Tree {
public void print() {
    System.out.println("I am Tree");
}
public static void main(String []args) {
    Tree t[] = new Tree[3];
    t[0] = new Tree();
    t[1] = new BanyanTree();
    t[2] = new PeepalTree();
    for(int i = 0; i < 3; i++) {
        ((Tree)t[i]).print();
    }
  }
}


public class BanyanTree extends Tree{
public void print() {
    System.out.println("I am BanyanTree");
  }
}


public class PeepalTree extends Tree{
public void print() {
    System.out.println("I am PeepalTree");
  }
}

Выход программы

I am Tree
I am BanyanTree
I am PeepalTree

По мне вывод должен быть

I am Tree
I am Tree
I am Tree

Я что-то здесь упускаю???

3 ответа

Это называется полиморфизмом. Метод принимает тот же тип (нет), тот же тип возврата (void) и то же имя (print). Поэтому, когда вы вызываете метод print, он вызывает наиболее специализированный (метод, который является самым низким в дереве наследования). Есть нечто, называемое тем, что они думают, что это за объект и чем он является на самом деле. Они думают, что это дерево, но на самом деле это баньяновое дерево. Если вы разыгрываете его, он ничего не делает, потому что массив деревьев заставляет его думать, что они являются деревьями, а если вы разыгрываете его на дереве, они все еще думают, что это дерево. С технической точки зрения, вы применяете это точно так же. Извините, что не включил это в мой ответ. Когда вы создаете новое дерево, структура наследования выглядит следующим образом.

Object (Cosmic Super-class)

 |

\ /

Tree

Самый специализированный метод - дерево. Однако, когда вы создаете дерево другого типа, скажем, BanyanTree, структура выглядит следующим образом.

Object

 |

\ /

Tree

 |

\ /

BanyanTree

Наиболее специализированный метод печати исходит от BanyanTree, поэтому он выполняет его. Извините, если вы не поняли, это довольно сложная тема.

Если DerivedClass продолжается BaseClass и имеет метод с тем же именем и той же подписью BaseClass тогда переопределение будет иметь место при полиморфизме во время выполнения. Также нет необходимости в upcast, так как вы уже инициализировали свой массив как BaseClass[ ]

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

https://youtu.be/CZ3VMokXqQI

Другие вопросы по тегам