是否有相当于super.super()的东西?

Mer*_*Mer 0 java

我知道你可以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(祖父母)构造函数调用不可能的时候证明了这样做的原因?

chi*_*ity 7

不,这是设计的.中间类故意隐藏其超类的一些功能,构造函数是它所在的一个区域.

想想这样.假设你有三类: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.