Наследование в Java и суперклассах (объект, класс) - PullRequest
10 голосов
/ 15 декабря 2010

Является ли java.lang.Object суперклассом всех пользовательских классов / объектов, унаследованных неявно?Я думал, что Java не поддерживает множественное наследование.Причина, по которой я спрашиваю, заключается в том, что я уже наследую от другого класса в своем пользовательском классе, и снова java принудительно вызывает неявное наследование java.lang.Object, разве это не множественное наследование?

Кроме того, является ли java.lang.class Класс также суперкласс для всех пользовательских классов / объектов?Если нет, то как в java-отражениях мы можем получить тип класса для любого переданного класса или вызвать isInstance для любого объекта?

Ответы [ 7 ]

5 голосов
/ 15 декабря 2010

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

java.lang.Class - это суперкласс всех объектов класса (не всех объектов!), Например, String.class.

2 голосов
/ 15 декабря 2010

Является ли java.lang. Объектом суперкласса всего пользовательский класс / объекты, унаследованные неявно

Незначительная коррекция: относительно следующего выражения:

суперкласс всех custom class/objects

Класс A является суперклассом другого класса B . Объекты или экземпляры из B не имеют A в качестве суперкласса (поскольку они являются объектами / экземплярами объектов, а не самими классами). Наиболее подходящее описание состоит в том, что эти объекты экземпляры класса B , который имеет A в качестве суперкласса.

Теперь к вашему вопросу по java.lang.Object. Это суперкласс всего, что может быть реализовано во время выполнения Java. Это включает в себя оба:

  1. классы, которые вы пишете (пользовательские классы), а также
  2. классы, предоставляемые самим языком Java.

Я думал, что Java не поддерживает несколько наследование.

Это не так. Он поддерживает только одиночное class (или implementation) наследование (в сочетании с множественным interface (или type) наследованием.

Вы путаете наследование с иерархией классов. Пожалуйста, см. Ниже.

Я спрашиваю, почему я уже унаследовать от другого класса в моем пользовательский класс и снова заставляет Java неявное наследование java.lang.Object поверх него,

И это хорошо с множественным наследованием. Скажем, у вас есть класс B, который вы написали, унаследованный от класса, уже предоставленного Java (скажем, класса A). Таким образом, существует линейное, переходное отношение следующим образом:

java.lang.Object > A > B

Где > обозначает immediate parent of. Любой класс, унаследованный от Object, может иметь только один и только один immediate parent. Ни в коем случае у вас не будет класса C, для которого не выполняется следующее ограничение для любых двух классов A и B:

для всех A, B {A> B -> для всех C {C> B <-> C == A}}

Это означает, что для всех классов A и B, таких как A, является immediate parent из B, тогда для всех классов C, C может быть только immediate parent из B * тогда и только тогда, когда C само по себе А.

С одним наследованием вы можете (теоретически) иметь бесконечную цепочку наследования A > B > C > ..., пока каждому классу в цепочке предшествует one and only one непосредственный родитель. В качестве полезной аналогии это напоминает соотношение predecessor в натуральных числах (0 preceedes 1 preceedes 2 which preceedes 3 ...).

Отказ от ответственности : Это не то, что вы используете в повседневной жизни. Однако, точно зная, что эти вещи означают под колпаком, вы получите огромную помощь в ориентации объекта.

Разве это не множественное наследование?

Нет (см. Выше.) В отличие от одиночного наследования - как объяснено выше - в множественном наследовании у вас может быть несколько непосредственных родителей (как видно в C ++).

Как мы заметили в приведенных выше определениях, отношение транзитивного наследования '>' происходит от одного класса к другому. Но с множественным наследованием отношение происходит от набора суперклассов {A} к одному классу {B}:

 {A} > B -> forAll a {a in A <-> a > B}

А в C ++, где у вас могут быть классы без родителей, тогда набор {A} может быть нулевым. В java у вас также есть множественное наследование, но ограничено interfaces (или типами.)

Также, класс java.lang.class также суперкласс для всех пользовательских классы / объекты?

Нет. Это поможет вам в обучении, если вы посетите руководства Javadoc, которые доступны в Интернете. Поищи это. На самом деле.

Если нет, то как в java-отражениях мы можем получить тип класса для любого класса прошло или позвоните isInstance по любому объект

Потому что экземпляры java.lang.Class (и все классы, используемые отражениями java) являются дескрипторами метаданных для других классов. Это не имеет ничего общего с наследованием. То, на что вы ссылаетесь, известно как meta-programming.

Кроме того, java.lang.Class является финальным классом;следовательно, это не может быть суперклассом чего-либо.

Функция java.lang.Class должна быть поставщиком / дескриптором метаданных для всех экземпляров и подклассов java.lang.Object (включая сам java.lang.Class.) Поле класса, связанное скаждый класс (.ie. String.class) является статическим полем уровня класса, описывающим метаданные, связанные с этим классом.

Метаданные, содержащиеся / описываемые java.lang.Class, содержат объекты доступа к метаданным для методов, конструкторов и полей.Опять же, это не имеет ничего общего с наследованием.

Наследование = / = метапрограммирование.

Надеюсь, это поможет.

1 голос
/ 15 декабря 2010

Пользовательский класс, который вы наследуете от себя, наследует прямо или неявно от Object, поэтому вы косвенно наследуете от Object.Цепь идет YourObject -> MiddleObject -> java.lang.Object.Нет необходимости множественного наследования.

Множественное наследование - это когда вы напрямую наследуете от двух не связанных классов.Например, если у вас есть класс PoliceDog, который наследуется непосредственно от Canine и PoliceOfficer, это будет множественное наследование.

1 голос
/ 15 декабря 2010

Все является Объектом, который сказал, что вы можете видеть структуру следующим образом:

Object

Animal

Cat

, а не так:

Object    Animal

      Cat

Где Cat расширяет оба, этокак в последнем примере, но Cat это extends Animal, что extends Object.

1 голос
/ 15 декабря 2010

Object - суперкласс любого другого класса. Когда ваш Child класс наследует от вашего Parent класса, он не является потомком Object, но все же является его потомком, поскольку его родитель является потомком Object. Поэтому, если вы не укажете суперкласс / родительский объект, он автоматически будет Object. Если вы укажете родительский элемент, то Object все равно будет суперклассом, поскольку по определению он является суперклассом родительского класса.

Class не является суперклассом каждого класса, но класс Object определяет средства для получения Class каждого класса с помощью метода getClass.

1 голос
/ 15 декабря 2010

Множественное наследование означает, что один класс имеет несколько прямых предшественников. Если A наследует от B, а B наследует от C, это не множественное наследование.

Я не понимаю второй вопрос ("java.lang.class Class"); Вы можете перефразировать это, чтобы уточнить.

0 голосов
/ 20 ноября 2015

В этом случае это не множественное наследование, а многоуровневое наследование.
Например, допустим, у вас есть класс, скажем, Class Animal, этот класс будет расширять класс Object по умолчанию и не расширяет другой класс.
Также давайте предположим, что у вас есть класс, который расширяет Class Animal, скажем, Class Lion.В этом случае Class Lion не будет напрямую наследовать класс Object, но, поскольку он наследует Class Animal, который наследует класс Object, он также косвенно наследует его.

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