Как класс Object может быть суперклассом подклассов?
Факт 1:
Java не поддерживает множественное наследование.
Факт 2:
Объект - это суперкласс всех других классов
Если у меня есть класс Parent
и класс Child
который наследует класс Parent
:
class Parent {
}
class Child extends Parent {
}
В этом случае, как класс Child
наследует класс Object
, если Java не поддерживает множественное наследование?
Как определяется связь между этими тремя?
Опция 1:
Вариант 2:
Ответы
Ответ 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 не может быть стандартным суперклассом класса.