我怎样才能调用祖父类的构造函数?

时间:2010-12-09 12:27:04

标签: java inheritance

我们如何调用祖母的构造函数。

例如:B继承自AC继承自B

我需要在A中调用C的构造函数。是否可以不创建B的实例?

如果我需要这个,可以用Java实现。

5 个答案:

答案 0 :(得分:6)

您无法直接在A的构造函数中调用C的构造函数。

但是,你可以(实际上必须)间接地称呼它。 B的每个构造函数都必须调用A的构造函数(显式或隐式)。由于C的每个构造函数都需要调用B的一个构造函数,因此总是调用A个构造函数之一。

答案 1 :(得分:3)

使用C中的super()和B中的A来访问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();
    }
}

输出:

  

一个
  乙
  C

注意:

如果所有都是默认构造函数,那么不需要来编写super();它将隐式调用它。

如果存在参数化构造函数,则需要super(parameter.. )

答案 2 :(得分:2)

C必须调用B的构造函数,然后B将调用A的构造函数... 没有其他选项可以调用 Grand parent的构造函数

答案 3 :(得分:0)

Joachim回答的一个例子:

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()调用,您实际上可以调用显式父构造函数。

答案 4 :(得分:0)

实际上,如果你有B类扩展A类,你就不能避免在创建B类实例时调用A的构造函数方法。如果这个机制对你来说不太清楚,我推荐这个阅读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()