Java:你如何访问两个级别的父类方法?

我有一个类,它扩展了我需要覆盖的类,但我需要调用该类的父类。 因为我不能打电话给super因为那将执行直接父母什么是获得我父类的父母的最佳方式?

我确信这是一个基本的问题,但是我已经有一段时间了,因为我一直在做任何java。

class A { public void myMethod() { /* ... */ } } class B extends A { public void myMethod() { /* Another code */ } } class C extends B { I need to call Class A here { /* Another code */ } } 

你不这样做:它违反了封装。

可以这么说,“不,我不想要我自己的行为 – 我想要我父母的行为”,因为假设你只有在正确维护自己的状态时才这样做。

但是,您无法绕过父母的行为 – 这会阻止它强制执行自己的一致性。 如果父类想要允许您直接调用祖父项方法,它可以通过单独的方法公开…但这取决于父类。

你不能因为它被B覆盖了.C里面没有A的实例。

问题是你想要调用A类的方法,但是从哪个实例? 你已经实例化了C,它是一个带有两个自有和inheritance方法的类。如果B重写了A的方法,你就无法从C访问它,因为方法本身属于C(不是方法) B,它已被inheritance,现在它在C)

可能的解决方法:

B不会覆盖myMethod()

C接收A的实例并将其保存为类属性。

A中的myMethod()是静态的,你使用A.myMethod() (我不推荐)

你问的是不好的做法,你说的是C不是B,而是A.你需要做的是让CinheritanceA.然后你可以打电话给super。

如果不是这是唯一的方法……

 public String A() { String s = "hello"; return s; } public String B() { String str = super.A(); return str; } public String C() { String s = super.B(); return s; } 

除了pakore回答的问题,你还可以链接super.myMethod()调用,如果它适合你。 你将从B中的myMethod()中调用A的myMethod()

 class A { public void myMethod() { .... } } class B extends A { public void myMethod() { .... super.myMethod(); .... } } class C extends B { public void myMethod() { .... super.myMethod(); //calls B who calls A .... } } 

你最终会从A调用myMethod,但间接地……如果这对你有用。

你不能直接调用A的方法。 在我遇到这种情况的少数情况下,解决方案是在A中添加一个方法来公开它的实现。 例如

 class A { public myMethod() { doAMyMethod(); } void doAMyMethod() { // what A want's on doMyMethod, but now it's available // as a separately identifiable method } } class C extends B { public void someStuff() { this.doAMyMethod(); } } 

该方案将公共接口(doMyMethod)与实现(doAMyMethod)分开。 inheritance确实依赖于实现细节,所以这并不严格如此糟糕,但我会尽可能避免它,因为它在A和C中的实现之间创建紧密耦合。

我为这个案子做的是:

在C类中创建类A的对象并访问那里的A类。 这个例子阐明了更多细节:

 class A{ int a; } class B extends A{ int a; } class C extends B{ int a; A obj = new A(); public void setData(int p,int q, int r) { this.a = p; // points to it's own class super.a = q;// points to one up level class ie in this case class B obj.a = r; // obj points the class A } public void getData() { System.out.println("A class a: "+ obj.a); System.out.println("B class a: "+ super.a); System.out.println("C class a: "+this.a); } } public class MultiLevelInheritanceSuper { public static void main(String args[]){ C2 obj = new C2(); obj.setData(10, 20, 30); obj.getData(); } 

}

这个例子的输出是:

 A class a: 30 B class a: 20 C class a: 10