Java не допускает множественного наследования, что означает, что класс не может наследовать от двух классов, которые не имеют ничего общего, а это означает, что они не находятся на одном и том же пути наследования. Однако класс может наследовать от большего количества классов, если эти классы являются суперклассами прямого суперкласса класса. Но класс наследуется от этих классов косвенно, что означает, что он ничего не «видит» от этих верхних суперклассов, верно? Я был сбит с толку при рассмотрении конструкторов (используя super () в конструкторе). Например, если у нас есть следующие классы:
public class A {
public A() {
....
}
}
public class B extends A {
public B() {
super();
....
}
}
public class C extends B {
public C() {
super();
....
}
}
конструктор класса C сначала вызывает конструктор класса B, используя super (). Когда это происходит, конструктор B сам сначала вызывает конструктор A (с super ()), но конструктор C ничего не знает о конструкторе A, верно? Я имею в виду, что наследование происходит только от прямого суперкласса - первого (ближайшего) класса из иерархии наследования. Это мой вопрос - под super () мы подразумеваем только конструктор прямого суперкласса, независимо от того, сколько других классов у нас есть в иерархии наследования. И это касается не только конструкторов, но и любых методов и переменных экземпляра.
С Уважением




Как вы говорите, конструктор C вызывает конструктор B, который вызывает конструктор A. Вы можете вызывать любые методы «A» для объекта C, и объект C может видеть неприкосновенные поля в A.
Даже если вы переопределите метод A «foo» в C, вы можете получить версию A с помощью «super.foo ()», при условии, что B также не отменяет его.
Вы должны вызвать конструктор некоторый в вашем непосредственном базовом классе. Это может быть
public class A {
public A() {
....
}
public A(String foo) {
....
}
}
public class B extends A {
public B() {
super();
.. or ..
super("ThisIsAB")
}
}
public class C extends B {
public C() {
super();
....
}
}
Таким образом, для конструкторов вы не можете ИЗБЕЖАТЬ создания промежуточных базовых классов, но вы можете выбрать, какой конструктор использовать. Если есть только конструктор без аргументов, он все обрабатывается за вас с помощью неявного вызова super. С несколькими конструкторами у вас есть еще несколько вариантов.
super может ссылаться на любую неприкосновенную переменную или метод в любом базовом классе. Таким образом, в этом отношении методы и переменные не то же самое, что конструкторы.
Я никогда этого не делал, но я подумал, что если вы не запустите свой ctor с помощью "super" вызова, он вызовет для вас конструктор по умолчанию (без аргументов).
Называются конструкторы для всех родителей. Фактически, в глубине души C знает об A, потому что B расширяет A. Например, если класс A содержит метод foo (), тогда вы можете вызвать foo () из C.
Итак, из вашего примера C вызывает конструктор из B, который вызывает конструктор из A. Кроме того, A также расширяется из класса Object. Так что конструктор в классе Object также вызывается!
Кроме того, вам не нужно добавлять вызов super (). Если нет вызова конструктора родительского элемента, неявно вызывается super.
Насколько известно C, все, что не перезаписывается в C, содержится в B, даже если под прикрытием класс A находится там, где может быть реализация.
public class A {
public A() {
}
public void aMethod() {
}
}
public class B extends A {
public B() {
super();
}
}
public class C extends B {
public C() {
super();
}
public void doWork() {
super.aMethod();
}
}
Таким образом, в этом случае A обрабатывает реализацию aMethod (), даже если вызов super () в конструкторе C вызывает конструктор B напрямую, а не A.
Даже если вы мог избегаете вызова промежуточного ctor, вы бы этого не захотели, потому что это означало бы, что у вас есть неинициализированные части промежуточных классов, к которым может обращаться самый нижний производный класс. К ужасным эффектам.
Но я чувствую, что вы пытаетесь обойти Java, используя множественное наследование. Это плохо. Вместо этого вы можете сделать это с точки зрения Java, используя интерфейс
class B extends A implements C {
// ... implement C methods here
}
или с помощью агрегации
class B extends A {
private C c;
}
множественное наследование не обязательно плохо - просто не поддерживается в java. В языках, которые делают это, допускаются приятные вещи, такие как миксины, где вы расширяете классы, чтобы добавить функциональность к своим собственным, без работы. например, в рубиновых миксинах juixe.com/techknow/index.php/2006/06/15/mixins-in-ruby
Все еще не уверен, какой вопрос вы задаете. Знак вопроса может помочь.