我知道你可以使用super.super.methodName()
来调用祖父母的方法版本,但有没有办法在链式构造函数调用中直接调用祖父类的构造函数?
(简体)示例:
class A {
public A(){}
public A(int i, boolean b) {
/*...*/
}
}
class B extends A {
public B(){}
public B(int i) {
super(i, true);
}
}
class C extends B {
public C(int i)
{
super.super(i,false); //This is not allowed, but you
//can see what I'm trying to do (call A(i,false).)
//this=new A(i,false); also doesn't work b/c this can't be LHS
//of assignment
}
}
..或者这是不允许的,我是否只是在尝试在(父)超类中进行super.superclass(祖父母)构造函数调用时证明了这样做的原因?
答案 0 :(得分:7)
不,这是设计的。中间类故意隐藏其超类的一些功能,构造函数是它所在的一个区域。
这样想。假设您有三个类:Animal
,Dog
,Terrier
。
Dog extends Animal
Terrier extends Dog
在Terrier
构造函数中,调用Dog
构造函数非常合适。你正在做的是说当创建Terrier
时,它应该做与狗有关的事情,然后做任何特定于梗的事情。
但是你想要做的是让Terrier
构造函数调用Animal
构造函数。这基本上是说Terrier
应该设置自己,而不考虑它是一只狗这一事实。现在可能发生任何事情:例如,初始化.woof()
方法所需字段的代码将无法处理。现在你的Terrier
在以后试图摆弄时会非常糟糕。
如果您希望Terrier
进行一些Animal
设置但避免Dog
设置,则表明您的类层次结构完全错误:您的Terrier
可能根本不是Dog
。
答案 1 :(得分:0)
没有。但你可以解决它。
您可以拨打super.foo()
,然后在您的父foo方法中拨打super.foo()
例如
class A {
public void foo() {
System.out.println("I want this");
}
}
class B extends A {
public void foo() {
super.foo();
}
}
class C extends B {
@Test
public void callFooTest() {
C c = new C();
c.foo();
//call foo() and you will get the one from Class A
}
}
构造函数的作用相同