Приведение подкласса к суперклассу и вызов функции, которую имеют оба класса - PullRequest
0 голосов
/ 25 апреля 2020
public class Test3 {
    public static void main(String[] args) {
        Derived04 b = new Derived04();
        Base04 a = (Base04)b;
        System.out.println(a.i);
        System.out.println(a.f());
    }
}

class Base04 {
    int i=1;
    public int f() {return i;}
}
class Derived04 extends Base04 {
    int i = 2; 
    public int f(){return -i;}
}

Оба класса включают метод f (), поэтому, когда я приводю d к a, какой метод он делает go, когда я вызываю af ()? Я думаю, так как a объявлен как тип Base04, когда вы делаете ai, он дает 1, но тогда почему он использует метод из подкласса?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Все дело в реализации и кастинге. таким образом, когда вы создаете Derived04, вы реализуете класс Derived04, а не его родителей Base04, поэтому даже если вы приведете его таким образом, он будет запускать реализованный метод, а не метод приведения, если только нет различия между f() в обоих классах. и это не наш случай.

0 голосов
/ 25 апреля 2020

почему он использует метод из подкласса?

Вы создаете объект класса Derived04 и просто приводите его к типу Base04. Это все еще Derived04 реализация.

...