如何在子类的超类的超类中调用方法

时间:2014-01-09 04:42:50

标签: java oop object

继承的层次结构就是这样。

A --> B --> C

和 示例代码如下所示

Class A{
  public void method(){....}
}
Class B extends A{
  public void method(){.....}
}
Class C extends B{
  public void method(){......}
}

要从C类访问A的方法(),我可以在C的方法()中编写像This这样的代码;

public method(){ //To call method() of A, when we call method() in C.
   Object obj=super.super();
   obj.method();
}

此代码是否适用于我的场景?如果是错的,请告诉我你的答案。

5 个答案:

答案 0 :(得分:1)

你不能用Java做到这一点。首先,super.super()没有意义。 (super();在构造函数中很有用,但在构造函数之外它并不意味着什么。)其次,如果你有一个C类型的对象,你就不能创建一个对象变量“同一个对象,但类型A“,这是你要做的。对象的运行时类型始终为C。所以即使这是合法的:

public void method() {
    A obj = this;
    obj.method();
}

即使obj被声明为A类型,其运行时的“真实”类型也始终为C,上述代码将调用method() { {1}},这是无限递归。

您可以C method() C之内method() B public void method() { super.method(); // calls the method in B } :{/ 1>

method

但是没有办法跳过这个并在A:

中拨打public void method() { super.super.method(); // illegal }
protected

如果您认为自己想要这样做,那么您可能需要重新考虑您的设计。一个重写方法通常要么调用父方法,要么添加一些新方法,要么它做一些全新的事情;它通常没有多大意义为它添加一些新的祖父素方法,但跳过在父方法中添加的新东西。毕竟,如果你真的想要这样做,你可以通过在A中添加一个具有不同名称的新{{1}}方法来实现它。

答案 1 :(得分:0)

不,method()中的A将覆盖在B中的method(),然后method()中的B会覆盖method()中的C 1}}然后您无法从method()拨打A中的C

答案 2 :(得分:0)

这不能在java中完成。您将收到编译器错误,如:“super.super.method();”行中存在错误。在Java中,类不能直接访问祖父母的成员。虽然它在C ++中是允许的。在C ++中,我们可以使用范围解析运算符(::)来访问继承层次结构中的任何祖先成员。在Java中,我们只能通过父类访问祖父母的成员。你怎么能在B类和C类的方法()中做到这一点:

void method(){
// method of class B
super.method(); // calls method() of class A
}

  void method(){
 // method of class C
super.method(); // calls method() of class B
}

希望这会有所帮助..

答案 3 :(得分:0)

我建议你做这样的事情。

Class A{
  public void method(){
    // implement your code here.
  }
}
Class B extends A{
  public void method(){
    super.method(); // will call method of A
  }
}
Class C extends B{
  public void method(){
    super.method();  // will call method of B
  }
}

答案 4 :(得分:0)

我不确定它是否是Java语言设计者的意图,但我会理解:只有单一继承,当C继承自B时,C应该只关心它的直接父级,即B. B决定从孩子身上隐藏A的任何东西,C不应该看到它。

有很多方法可以解决它,例如:

假设在A的设计中,你预见到这种情况,并希望任何级别的儿童班能够使用你的method,你可以创建一个受保护的儿童使用:

class A {
    protected void methodInternal() {...}
    public void method() { methodInternal(); }
}

class B extends A {
    public void method() {
        someOtherLogic();
    }
}

class C extends B {
    public void method() {
         methodInternal();
         somethingElse();
    }
}

如果是B的开发者决定更改method的impl但是仍然希望让孩子使用A method的灵活性,他可以做类似的事情:

class A {
    public void method() {  }
}

class B extends A {
    public void method() {
        someOtherLogic();
    }
    protected void originalMethod() {
        super.method();
    }
}

class C extends B {
    public void method() {
         originalMethod();
         somethingElse();
    }
}