Наследование в java и Суперклассах (Object, Class)

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

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

7 ответов


все это объект, который сказал, что вы можете видеть структуру как это:

Object

Animal

Cat

, а не как этот:

Object    Animal

      Cat

здесь Cat расширяет оба, это не похоже на этот последний пример, но это Cat это extends Animal, который extends Object.


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

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


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

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

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

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

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

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

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

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

вы путаете наследование с иерархией классов. PLS увидеть ниже.

причина, по которой я спрашиваю, если я уже наследовать от другого класса в моем пользовательский класс и снова Java-это принуждение неявное наследование Ява.ленг.Объект поверх него,

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

java.lang.Object > A > B

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

форалл А, B { А > Б -> форалл с { с > B C == A } }

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

С одним наследованием вы можете иметь (теоретически) бесконечную цепочку наследования 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++, где вы можете иметь классы без родителей, то set {A} может быть нулевым. В java у вас также есть множественное наследование, но ограниченное interfaces (или типов.)

кроме того, это java.ленг.класс также суперкласс для всех пользовательских классы/объекты?

нет. Это поможет вашему обучению, если вы посетите руководства Javadoc, которые доступны в интернете. Посмотреть его. Действительно.

если нет, то как в Java reflections мы можем получить тип класса для любого класса пройдено или вызов isInstance на любой объект?

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

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

функция java.ленг.Класс должен быть поставщиком/дескриптором метаданных для всех экземпляры и подклассы java.ленг.Объект (включая java.ленг.Сам класс.) Поле класса, связанное с каждым классом (.т. е. Струна.class) - это статическое поле уровня класса, описывающее метаданные, связанные с этим классом.

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

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

надеюсь, что это помогает.


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

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


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

Class не является суперклассом каждого класс, но Object class указывает средство для полученияClass С getClass метод.


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

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


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