Сохранение подкласса как типа суперкласса и использование его методов в Java

1

В приведенном ниже коде подкласс расширяет свой суперкласс и переопределяет его метод, используя его для вызова другого метода, уникального для подкласса, который использует переменную подкласса.

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

class Superclass {
    void go() {
        System.out.println(0);
    }
}

class Subclass extends Superclass {
    int i = 1;

    @Override
    void go() {
        run();
    }

    void run() {
        System.out.println(i);
    }
}

public class JavaApplication {
    public static void main(String[] args) {
        Superclass instance = new Subclass();

        instance.go();                 // outputs 1; it must have called run() and accessed i
        instance.run();                // causes compile-time error
        System.out.println(instance.i);// causes compile-time error
    }
}

Когда экземпляр Subclass сохраняется как тип Superclass, он все равно имеет доступ ко всем полям и методам подкласса. Так почему я не могу получить к ним доступ напрямую?

Теги:
inheritance
superclass
subclass

1 ответ

0

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

Но в случае методов экземпляра метод вызывается в соответствии с типом передаваемого объекта, а не в соответствии с типом ссылки

  • 0
    За исключением того, что проблема OP состоит в том, что на метод подкласса нельзя даже ссылаться, так как ссылка объявлена как суперкласс.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню