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

时间:2014-08-28 08:07:58

标签: 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
        }
}

..或者这是不允许的,我是否只是在尝试在(父)超类中进行super.superclass(祖父母)构造函数调用时证明了这样做的原因?

2 个答案:

答案 0 :(得分:7)

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

这样想。假设您有三个类:AnimalDogTerrier

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
   }
}

构造函数的作用相同