我们如何调用祖母的构造函数。
例如:B
继承自A
而C
继承自B
。
我需要在A
中调用C
的构造函数。是否可以不创建B
的实例?
如果我需要这个,可以用Java实现。
答案 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()