实例化一个A的对象,A a = new A(); 通过对象来调

解决方案 »

  1.   

    哈哈,lz这个问题问得不错,学习和工作中也没有遇到过这样的问题,引发了思考,我也是第一次听你提这个问题,不过还是有办法解决的,我跟lz分享一种解决方案,利用反射:lz可以先自己独立实现,然后参考下面代码:
    class C extends B {
    void disp() {
    try {
    Class<?> clazz = getClass().getSuperclass().getSuperclass();
    clazz.getDeclaredMethod("disp")
    .invoke(clazz.newInstance());
    } catch (IllegalAccessException | IllegalArgumentException
    | InvocationTargetException | NoSuchMethodException
    | SecurityException | InstantiationException e) {
    e.printStackTrace();
    }
    }
    }
    楼主学习进步!
      

  2.   

    class C extends B{
    void disp(){
    A a = new A();
    a.disp();
    }
    }
      

  3.   

    #1,#3 是不对的,没考虑到成员变量。new 得到的成员,已经不是 this的成员了。我试过在C的disp(){ A a = (A)(this)}; 编译通过,但执行时出错。谢谢2#, 我真是吓一跳,在C++中  只要 A::disp() 就可以了。这个要求,在我们在工程中是普遍的,难道Java 没有直到接的支持吗? 
      

  4.   

    最好在子类中增加调用父类方法的方法class A {
    void println(String str) {
    System.out.println(str);
    }
    void disp() {
    println("A");
    }
    }class B extends A {
    void superDisp() {
    super.disp();
    }
    void disp() {
    println("B");
    }
    }class C extends B {
    @SuppressWarnings("unused")
    public static void main(String[] args) {
    C c=new C();
    c.disp();
    }
    void disp() {
    super.superDisp();
    }
    }
      

  5.   

    想法多样是好的,
    不过想的有点多。
    另外这是叫重写,不是叫重载,这点还是要区分清楚的,java面试经常被问到。
    B类其实没有用到disp()这个方法,所以实际中是不应该被重写的
    如果B类不重写disp()的话,那么C中super.disp();调用的就是A类的。。
      

  6.   


    恕在下直言,2楼也是创建的新对象,clazz.newInstance().
      

  7.   

    invokedynamic 指令可以实现  jdk 1.7 加入的新特性