我知道你可以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
}
}
Run Code Online (Sandbox Code Playgroud)
..或者这是不允许的,我是否只是在尝试在(父)超类中使一个super.superclass(祖父母)构造函数调用不可能的时候证明了这样做的原因?
不,这是设计的.中间类故意隐藏其超类的一些功能,构造函数是它所在的一个区域.
想想这样.假设你有三类:Animal,Dog,Terrier.
Dog extends Animal
Terrier extends Dog
Run Code Online (Sandbox Code Playgroud)
在Terrier构造函数中,调用Dog构造函数非常合适.你正在做的是说当a Terrier创建时它应该做与狗有关的事情,然后做任何特定于terrier的事情.
但是你想要做的是让Terrier构造函数调用Animal构造函数.这基本上就是说Terrier应该自己设定,而不考虑它是一只狗的事实.现在可能发生任何事情:例如,初始化.woof()方法所需字段的代码将无法处理.现在Terrier,当你试图摆弄时,你的处境非常糟糕.
如果您希望Terrier进行某些Animal设置但避免Dog设置,则表明您的类层次结构完全错误:您Terrier可能根本不是Dog.