public interface A{}
public class B implements A{}再写一个类:其中main方法为:
A a=new B();
a.getclass 返回值是A。 既然是A,为何可以调用B的方法?

解决方案 »

  1.   

    因为到栈里只是创建了A的引用,正在的对象是在堆里创建了B类的对象,当用A调用时就调用了 B类中的方法
      

  2.   

    不就是创建A(父类)对象a指向B(子类)的引用吗,对象的类型自然就是A 咯.
    然后,你调用a的方法a.出来的方法都是A里定义好的,不过实现了B里相应的代码
      

  3.   

    Well,it'a good problem.But i just can tell you , you'd better to study the core java , this is the base of java .You know , inherit ,polymorphous and encapsulation are the core of oo 
      

  4.   

    你定义的是A的引用a,getClass  -- A
    而你的引用a指向的对象是 实例化的是B类,所以执行B的方法了。
      

  5.   

    那就是java中的最核心的思想,多态。去看看书,建议你看看马士兵的视频,初级里有讲多态的,其实你不必那么纠结,真正的懂得多态,那他一定比较牛了,你现在只要知道怎么去用,就可以了,在今后的项目中你会慢慢的体会到他的原理和好处的。
      

  6.   

    java里多态的体现,这样A类的对象可以调用B类所复写A类的方法。。
      

  7.   

    java里面基于借口编程经常会用到这个,
    灵活性更高,低耦合度。我也是知道这么去用
    具体的原理也不大清楚~
      

  8.   

    这就是java的多态的体现了啊。
      

  9.   

    做了一下,在JAVA1.6下,B执行接口A
    A a = new B();
    a.getClass() 得到的是B
    a 无法调用B中特有的方法和LZ的结论完全相反。
    public interface Something { public String printMe();
    }public class SomethingImpl implements Something{ @Override
    public String printMe() {
    // TODO Auto-generated method stub
    return "i m implementing Something";
    } public String mySpecific() {
    return "i m not implementing Something, i m on my own!";
    }
    }public class SomethingTest { public static void main(String args[]) {
    Something a = new SomethingImpl();

    System.out.println(a.printMe());
    System.out.println(a.getClass().toString());
    //无法调用 a.mySpecific()
    }
    }//执行结果:
    // i m implementing Something
    // class test.coder.interfacetest.SomethingImpl
      

  10.   

    这个就是java的一个机制啦,直接调用覆盖后的方法
      

  11.   

    这就是所谓的多态啦
    java虚拟机会建立一张表,保存引用和方法的映射关系
    在运行的时候根据实际情况动态绑定方法
      

  12.   

    这个看你在内存里调用 的是内个方法,接口A和实现B
    如果 A a= new B(),这里new的是类B,在内存中开辟的B的空间,变量a只是指向这段空间,这是java里多态,所以用a调用实际内存中就是调用了B的方法,a.getClass()得到的也是B类
      

  13.   

    这是java的多态机制,当class文件运行的时候 ,jvm会调用你实现类的方法(父类指向子类引用),所谓的动态加载
      

  14.   

    不知道楼主怎么得出a.getClass等于A的结论的,这是不可能的,a.getClass()得到是B,这是因为a相当于一个指针,指向new B()创建的内存块。所调用的方法实际是B的方法,getClass()方法实际是从Object继承而来。从内存的角度来考虑这个问题会很清楚了。
      

  15.   

    我以前试过,今天看了楼主这帖子之后又试了一次,输出的是B
    楼主你可以这样认为 
    public A getA();这个方法中A可以代表A和A的实现类,当返回值是A的时候A的类型就是A,返回B时A的类型就是B.
    父类的引用可以指向子类.
    你看
    public interface A{}
    public class B implements A{}再写一个类:其中main方法为:
    A a=new B();
    a其实是一个引用变量,它指向的对象是new B();当使用a的时候A就去找到对应的对象.