Наследование классов объектов - PullRequest
0 голосов
/ 19 июня 2019

Мы знаем, что класс A неявно расширяет класс Object, но если мы создаем экземпляр объекта класса Object с помощью конструктора класса A и пытаемся получить доступ к методу print () класса A, он показывает ошибку времени компиляции, тогда как в другом случае класс B расширяет класс A и объект класса A, созданный с помощью конструктора класса B, и попытка доступа к методу print () работает нормально.

class A{
    public void print(){
        System.out.println("A");
    }
}
class B extends A{
    public void print(){
        System.out.println("B");
    }
}
public class MyClass {
    public static void main(String args[]) {
        Object o = new A();
        o.print(); // error
        A a = new B();
        a.print();  // print B
    }
}

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Эта строка:

o.print(); // error

Вы знаете, что o - это на самом деле типа A.

Компилятор может знать, но в Java он не знает.Компилятору известно только, что существует некоторая переменная с именем o, типа Object.

Таким образом, компилятор шлепает вас пальцами по поводу вызова метода для o, который объявил тип Object не поддерживает!

Другие языки "умнее" в таких вещах, но в Java так обстоит дело.

1 голос
/ 19 июня 2019

Ваш пример с классом B расширяет A не то же самое, что в случае A расширяет Object. Разница в том, что в первом случае суперкласс (A) содержит метод print(), во втором случае суперкласс (Object) не содержит print(). Если вы удалите метод print() из класса A, вторая часть также не будет работать:

class A{
}

class B extends A{
    public void print(){
        System.out.println("B");
    }
}

public class MyClass {
    public static void main(String args[]) {
        Object o = new A();
        //o.print(); // error
        A a = new B();
        a.print();  // error
    }
}
0 голосов
/ 19 июня 2019

Поскольку класс Object не имеет метода print () и ссылка o имеет тип Object, компилятор выдаст ошибку.В случае 2: ​​класс A имеет метод print (), поэтому нет ошибки компиляции, и во время выполнения он вызывает метод print () класса B, потому что мы присвоили ссылку на класс B. во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...