class A{ public void f(){ System.out.println("A.f()"); }}class B extends A{ public void f(){ System.out.println("B.f()"); }}class C extends B{ public void f(){ super.super.f();//想想这种情况下怎么办,也许有些人认为这种做法在实际应用中不会出现, //但是如果真要这么做,怎么解决 System.out.println("C.f()"); }} [解决办法] Java中所有的类都是继承制Object,那么如果你写一个类,如: public class A {} 也就是说你的类A默认继承了Object,等同于 public class A extends Object {}
如果你的类A里面有一个方法去调用super.super.xxx 这个时候你说调用的是什么呢?
所以java不允许调用super.super。
这才是根本的原因。 [解决办法]
[解决办法] 面试题比较变态,谁会用super.super?
[解决办法] 可不可以这样理解? 子类的构造方法中如果什么都没有写的话其实是隐含了调用父类的无参的构造方法super(); 即 class A{ A(){ } } class B extends A{ B(){ } } 等价于: class B extends A{ B(){ super(); } }
所以如果有class C extends B{}的时候 C的构造方法会super();的构造方法,而B的构造方法会自动super();A 当然A会super();Object 所以根本就不需要super.super.xxx [解决办法] class A{ public void f(){ System.out.println("A.f()"); } } class B extends A{ public void f(){ System.out.println("B.f()"); } } class C extends B{ public void f(){ super.f();//想想这种情况下怎么办,也许有些人认为这种做法在实际应用中不会出现, //但是如果真要这么做,怎么解决 //不能用super.super.f(); System.out.println("C.f()");
} }
public class SuperTest { public static void main(String args[]) { C c= new C(); c.f(); } }