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

Java 如何在子类的超类的超类中调用方法,java,oop,object,Java,Oop,Object,继承的层次结构是这样的 A --> B --> C 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(){ supe

继承的层次结构是这样的

A --> B --> C
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
  }
}
及 示例代码如下所示

Class A{
  public void method(){....}
}
Class B extends A{
  public void method(){.....}
}
Class C extends B{
  public void method(){......}
}
要从C类访问A的方法(),我可以在C的方法()中编写如下代码


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

否,
A
中的
method()
将在B中被
method()
覆盖,然后
B中的
method()
将在
C中被
method()
覆盖,那么您就不能调用
method()
A
from
C

中的
不,这不能在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
}

希望这有帮助

在Java中不能这样做。首先,
super.super()
没有意义。(
super();
在构造函数内部很有用,但在构造函数外部它并不意味着什么。)其次,如果您有一个
C
类型的对象,您不能创建一个“同一个对象,但类型为
a
”的对象变量,这正是您要做的。对象的运行时类型始终为
C
。因此,尽管这是合法的:

public void method() {
    A obj = this;
    obj.method();
}
尽管
obj
被声明为类型
A
,但它在运行时的“真实”类型始终是
C
,并且上面的代码将调用
C
中的
方法()
,这是无限递归

您可以在
C
中调用
method()
B
中调用
method()
,如下所示:

public void method() {
    super.method();     // calls the method in B
}
但是,没有办法跳过这一步,在以下情况下调用
方法

public void method() {
    super.super.method();     // illegal
}

如果你认为你想这样做,那么你可能需要重新考虑你的设计。重写方法通常要么调用父方法并向其添加新的内容,要么执行全新的内容;在祖父母方法中添加一些新内容通常没有多大意义,但是跳过在父方法中添加的一些新内容。如果在所有这些之后,您真的仍然想这样做,那么您可以通过在一个具有不同名称的中添加一个新的
protected
方法来实现

我建议你这样做

A --> B --> C
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
  }
}

我不确定这是否是Java语言设计者的意图,但我可以理解这一点:只有单继承,当C从B继承时,C应该只关心它的直接父级,即B。如果B决定对其子级隐藏A的任何内容,C应该看不到这一点

有很多解决方法,例如:

假设在A的设计中,您预见到了这种情况,并希望任何级别的子类都能够使用您的
方法
,您可以创建一个受保护的子类供其使用:

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的开发人员决定更改
方法的impl,但它仍然希望保留让孩子使用A的
方法的灵活性,他可以做如下操作:

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();
    }
}

你试过运行它吗?用一些容易识别的东西,比如类名的
println
,填写
A
B
方法的实现。然后测试它,看看自己会发生什么。如果它甚至没有编译,很明显你的问题的答案是“不”。尽管如此,我还是建议如果
C
需要使用
A
的实现,那么它可能更适合直接作为
A
的子类。如果它同时使用
A
B
中的内容,那么类可能太少,应该将常见的功能分解为它自己的结构。super.super();--编译错误首先,修复方法声明(没有返回类型,并且它们不是空的)。其次,我认为您需要
super.super.method()谢谢Frisch,但是super.super.method()将无法工作。这将是一个错误,因为它违反了JAVA的封装属性。但是,只要成员字段不是私有的,它总是可以访问这些字段。如果不能使用
超级.field
,则可以使用
((A)this).field
)。但这对方法不起作用。如果您想使用super关键字调用父类方法,则此代码将起作用,否则您可以创建父类的类对象,然后调用父类的方法。@iamygish您实现的方法没有任何返回类型。在Java中,任何类型的方法/函数都必须返回。@Qadir我刚才提到了如何解决这个问题。是的,我知道返回类型是必须的。这是很酷的Qadir,但根据我的要求,我不应该更改a类和B类中的任何代码。只有在C类中,我可以做编码。还有一件事,我不应该直接为类A创建对象。