Как класс Object может быть суперклассом подклассов?

Факт 1:

Java не поддерживает множественное наследование.

Факт 2:

Объект - это суперкласс всех других классов

Если у меня есть класс Parent и класс Child который наследует класс Parent:

class Parent {

}

class Child extends Parent {

}

В этом случае, как класс Child наследует класс Object, если Java не поддерживает множественное наследование?

Как определяется связь между этими тремя?

Опция 1:

enter image description here

Вариант 2:

enter image description here

Ответ 1

Это вариант 2. Если вы определяете суперкласс, это будет ближайший суперкласс вашего класса. Если вы не определяете одно, Object будет непосредственным суперклассом.

class Parent {

}

class Child extends Parent {

}

эквивалентно

class Parent extends Object {

}

class Child extends Parent {

}

Таким образом, хотя Object является суперклассом всех классов, в иерархии классов могут быть некоторые шаги, прежде чем вы перейдете к Object. Это не непосредственный суперкласс всех классов.

Ответ 2

Object не может быть прямым родителем, но он всегда является суперпользователем.

Child extends Parent
Parent extends Object

 |
 V

Child [indirectly] extends Object

Ответ 3

JavaDoc говорит:

Класс Object - это корень иерархии классов....

Если класс не расширяет какой-либо другой класс, декалинируя его, используя ключевое слово extends оно распространяется, хотя и неявно из Object.

В документации говорится:

В отсутствие какого-либо другого явного суперкласса каждый класс неявно является подклассом Object.

См. Пример 8.1.4-1 "Прямые суперклассы и подклассы" в JLS, глава 8.1.4.

Он показывает, что class Point { int x, y; } class Point { int x, y; } "является прямым подклассом Object"

Кроме того, в документации говорится:

Классы могут быть получены из классов, которые производятся из классов, которые производны из классов и т.д., И в конечном итоге получены из самого верхнего класса Object. Говорят, что такой класс происходит от всех классов в цепочке наследования, тянущихся к Object.

JLS заявляет, что это короткий и формальный:

Отношение подкласса является транзитивным замыканием отношения прямого подкласса.

Таким образом, класс Object является суперклассом всех классов.

Но в документации также говорится:

За исключением Object, у которого нет суперкласса, каждый класс имеет один и только один прямой суперкласс (одно наследование).

Продолжая с примера, class ColoredPoint extends Point { int color; } class ColoredPoint extends Point { int color; } "является прямым подклассом класса Point.". По транзитивному отношению это a (непрямой) подкласс класса Object.

Подводя итог:
Object является либо прямым суперклассом, либо транзитивным отношением последнего суперкласса любого другого класса.

Отвечая на вопросы:

  • Java не поддерживает множественное наследование: он обеспечивает единичное наследование транзитивным способом. Каждый класс распространяется непосредственно только на одну суперкарсу.
  • Как соотносятся: Класс Parent соответствует классу Point и классу Child классу ColoredPoint примера JLS. Только вариант 2 показывает это отношение.

Ответ 4

Ну, это интересная дискуссия. Я думаю, что это будет вариант № 2. Как будто вы попробуете приведенный ниже код.

public static void main(String []args){
      Parent p=new Parent();
      Class c= p.getClass();

      Child child =new Child();
      Class c1= child.getClass();
      System.out.println(c.getSuperclass());
      System.out.println(c1.getSuperclass());

 }

Вы получите результат как:

class java.lang.Object 
class Parent

Ответ 5

Вариант 2, поскольку каждый объект получает методы Object.class

Ответ 6

Правильный ответ - вариант 2. Любой Java-класс наследует всех родителей для своих родителей. Другими словами.

Класс A расширяет класс B Класс B расширяет класс C Класс C расширяет класс D

Класс X расширяет A → это означает, что A наследует все защищенные/пакетные/общедоступные поля из B, C и D.

В вашем примере класс Child наследует свойства родителя, а также свойства объекта в переходном режиме.

Ответ 7

Из Class Object

public class Object
Класс Object - это корень иерархии классов.
Каждый класс имеет объект как суперкласс.
Все объекты, включая массивы, реализуют методы этого класса.

Это означает, что каждый класс Java имеет Object как root в иерархии, не обязательно как его непосредственный родитель.

Ответ 8

В Java нет множественного наследования класса, который расширяет только 1 класс; имеет один непосредственный базовый класс. Косвенно класс может иметь много предков: у ребенка есть родительский и объект как предковые "супер" классы.

Object --> Parent --> Child
                  --> OtherChild

Relation: 1 --> N

Причиной избежать множественного наследования, как в C++, была двусмысленность:

Псевдокод, предполагающий множественное наследование:

class A : Comparable
class B : Comparable

class Child : A, B {

    @Override A? B?
    int compareTo(Child rhs) { ... super.compareTo ? ... }
}

A a = new Child();
B b = new Child();
a.compareTo(b);

Ответ 9

Прежде всего, используя Java 8, можно выполнить множественное наследование, используя методы по умолчанию для интерфейсов.

Во-вторых, ваше понимание класса Object правильно представлено в "Варианте 2".
Однако это не множественное наследование, а многоуровневое наследование. "Вариант 1" - множественное наследование.

Проверьте эту ссылку, чтобы узнать больше о них.

Ответ 10

option 2.Object является суперклассом всех других классов, но Object не может быть стандартным суперклассом класса.