Java和使用super跳过一个级别
Java中的一个常见问题是如何在继承关系中跳过一个级别并调用超类的方法。这个问题通常出现在需要在子类中调用父类的某个方法,但在中间的父类中并没有实现该方法的情况下。
解决这个问题的一个方法是在父类中创建一个final方法的副本,然后在子类中调用这个副本。这样子类就可以直接调用父类的方法,而无需在中间的父类中实现该方法。
下面是一个示例代码,演示了如何通过创建final方法的副本来解决这个问题:
class A{ public void some(){ sharedCode() } public final void someFromSuper(){ sharedCode() } private void sharedCode() { //code in A.some() } } class B extends A{ public void some(){} } class C extends B{ public void some(){ //I want to call A.some(); someFromSuper(); } }
在这个示例中,类A定义了一个公共方法some()和一个私有方法sharedCode()。类B继承自A,并重写了some()方法。类C继承自B,并在其some()方法中调用了父类A的someFromSuper()方法。
通过这种方法,类C可以直接调用父类A的方法,而无需在类B中实现该方法。这种解决方法虽然可以解决问题,但实际上是一种较差的设计,因为它打破了继承的本意。然而,有时在一些特殊情况下,这种解决方法是必要的,甚至在Java开发工具包(JDK)中也有使用。
总结起来,通过创建final方法的副本,我们可以在继承关系中跳过一个级别并调用超类的方法。尽管这种解决方法并不是最佳实践,但在某些特殊情况下是必要的。
Java中的super关键字用于引用父类的成员变量或方法。使用super关键字可以在子类中访问父类的成员,但是在Java中是不允许通过super.super.method()的方式调用父类的父类的方法的。
这个限制是由Java语言设计的继承机制决定的。Java中的继承是单继承的,意味着一个子类只能有一个直接的父类。因此,通过super关键字只能访问父类的成员,而无法跳过父类去访问更上一级的父类。
在Java中,为了实现多层继承,可以使用间接的方式来实现。例如,如果想要调用父类的父类的方法,可以通过在子类中创建一个中间类,并继承父类的父类,然后在中间类中调用父类的方法。这样就可以间接地达到调用父类的父类方法的目的。
以下是一个示例代码,演示了如何通过创建中间类来调用父类的父类方法:
class Grandparent { public void grandparentMethod() { System.out.println("Grandparent method"); } } class Parent extends Grandparent { public void parentMethod() { System.out.println("Parent method"); } } class Child extends Parent { public void childMethod() { System.out.println("Child method"); } } class Intermediate extends Grandparent { public void intermediateMethod() { super.grandparentMethod(); } } public class Main { public static void main(String[] args) { Child child = new Child(); child.childMethod(); Intermediate intermediate = new Intermediate(); intermediate.intermediateMethod(); } }
在上面的示例中,Child类继承了Parent类,而Parent类又继承了Grandparent类。为了调用Grandparent类中的方法,创建了一个Intermediate类,并继承了Grandparent类。通过在Intermediate类中使用super关键字,可以调用Grandparent类的方法。
这样,通过创建一个中间类,就可以间接地调用父类的父类的方法,避免了直接调用super.super.method()的限制。