Как я могу вызвать конструктор класса прародителя? - PullRequest
3 голосов
/ 09 декабря 2010

Как мы можем назвать конструктор прародителя.

например: B наследуется от A и C наследуется от B.

Мне нужно вызвать конструктор A в C. Возможно ли это без создания экземпляра B?

Если мне нужно это, как это можно реализовать в Java.

Ответы [ 5 ]

6 голосов
/ 09 декабря 2010

Вы не можете вызвать конструктор A непосредственно в конструкторе C.

Вы можете (и фактически должны) вызывать его косвенно, 'хотя.Каждый конструктор B должен вызывать конструктор A (явно или неявно).Поскольку каждый конструктор C должен вызывать один из конструкторов B, вы будете всегда вызывать один из A s конструкторов.

3 голосов
/ 09 декабря 2010

используйте super() из C и из B для доступа к конструктору A

class A {
    public A() {
        System.out.println("A");
    }
}

class B extends A {
    public B() {
        super();
        System.out.println("B");
    }
}

class C extends B {
    public C() {
        super();
        System.out.println("C");
    }
}

public class Inheritance {
    public static void main(String[] args) {
        C c = new C();
    }
}

Выход:

A
B
C

Примечание:

Если все являются конструкторами по умолчанию, тогда не нужно для записи super();, он будет неявно вызывать его.

Если есть параметризованный конструктор, тогда нужно super(parameter.. )

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

C должен будет вызвать конструктор B, и, в свою очередь, B вызовет конструктор A ... Нет другой опции для вызова Конструктор Grand parent

0 голосов
/ 09 декабря 2010

На самом деле, если у вас есть класс B, расширяющий класс A, вы не можете избежать вызова метода конструктора для A при создании экземпляра класса B. Если этот механизм не кажется вам понятным, я рекомендую чтение о системе наследования Java: http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html.

Вот пример:

class A {
    public A() {
        doSomethingA();
    }
}

class B extends A {
    public B() {
        super(); // this is the call to the A constructor method
        doSomethingB();
    }
}

class C extends B {
    public C() {
        super(); // this is the call to the B constructor method
        doSomethingC();
    }
}

Создание нового объекта с new C() будет включать, по порядку, вызов A() - B() - C()

0 голосов
/ 09 декабря 2010

Пример ответа Иоахима:

class A {
    A() { System.out.print("A()")};
    A(Object o) { System.out.print("A(Object)")};
}
class B {
    B() { super(); System.out.print("B()")};
    B(Object o) { super(o); System.out.print("B(Object)")};
}
class C {
    C() { super(); System.out.print("C()")};
    C(Object o) { super(o); System.out.print("C(Object)")};
}

Теперь вызов:

C c = new C();

выдаст: A()B()C(), а вызов:

C c = new C(new Object());

производить: A(Object)B(Object)C(Object).

Как видите, манипулируя вызовом super(), вы можете вызвать явный родительский конструктор.

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