Как класс Object может быть суперклассом подклассов? - PullRequest
0 голосов
/ 31 августа 2018

Факт 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

Ответы [ 10 ]

0 голосов
/ 31 августа 2018

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

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

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

0 голосов
/ 31 августа 2018

С Class Object

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

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

0 голосов
/ 31 августа 2018

Отсутствие множественного наследования означает, что в Java класс расширяет только 1 класс; имеет один непосредственный базовый класс. Косвенно у класса может быть много предков: у Child есть Parent и Object как «супер» классы предков.

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);
0 голосов
/ 31 августа 2018

Ну, это интересная дискуссия. Я думаю, что это будет вариант № 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
0 голосов
/ 31 августа 2018

JavaDoc говорит:

Класс Object является корнем иерархии классов. ...

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

Документация гласит:

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

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

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

Более того, в документации сказано:

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

В JLS это кратко и формально:

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

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

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

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

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

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

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

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

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

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

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

В вашем примере, Class Child наследует свойства Parent, но также и свойства Object в переходном режиме.

0 голосов
/ 31 августа 2018

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

Child extends Parent
Parent extends Object

 |
 V

Child [indirectly] extends Object
0 голосов
/ 31 августа 2018

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

0 голосов
/ 31 августа 2018

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

class Parent {

}

class Child extends Parent {

}

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

class Parent extends Object {

}

class Child extends Parent {

}

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

0 голосов
/ 31 августа 2018

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

...