请问:
我以前对多态的理解是:
如:A a = new B();B是A的子类 编译器在编译期并不知道a引用指向的是一个B类对象 编译器是无法识别的 编译器认为a指向的是一个A类对象 但在运行时侯虚拟机就可以知道并识别出来了而看到think in java上又看到这样一句:
多态只发生在调用方法的时候难道在运行的时候虚拟机并不知道a指向的是一个B类对象 只有在调用方法的时候才知道吗 
谢谢

解决方案 »

  1.   

    你说的运行和TIJ里面说的调用是一个意思。就是运行过程中调用的时候。更详细一点应该是这样的:你的程序开始运行的时候,系统还是不知道这个对象的具体类型的。因为直到在运行到调用的地方前,这个变量有可能被赋值为任何一个对象,比如b1,b2等等,直到调用的时候,系统才根据实际a指向的对象去调用b1或b2。
      

  2.   

    你说的是重载overloading,根据不同的参数调用不同的方法,这是静态绑定的,跟多态没有关系。多态是同样的方法(签名相同:名称,参数,顺序都相同)对于同一类层次结构中的不同对象表现不同。多态是和覆盖overriding相关的。不要混淆概念。
      

  3.   

    1. 同意13楼。
    2. 对于 A a = new B(); B extends A 假如 A 有一方法 test() B 类把它给覆盖了,当运行到 a.test() 时究竟是调用 A 类中定义的 test 方法还是 B 类定义的 test 方法要看 a 具体引用的对象的类型,根据实际类型决定最终要调用 B 类中的 test 方法,此为多态。而在执行到 a.test() 之前不需要知道 a 引用的对象究竟是何类型。而动态绑定是实现多态的一种手段。
      

  4.   

    多态是动态绑定。在运行时(runtime)是确定使用方法的方法名指向哪一个方法。
    A a = new B(); B extends A 
    对于这个例子。声明的时候,a的类型为A。但是a所指向的实例为A的子类,即B。
    也就是说,虽然a是B的实例,但是仍然是A类型。
    方法自然都是A类型的方法。
    当程序运行到a.test()的时候,虚拟机会去寻找对象可用的名为test()的方法。
    此时如果B类型已经覆盖了父类的该方法,虚拟机首先捕捉到该方法并执行。
    如果B中找不到。则会继续向上寻找父类的名为test()的方法。
      

  5.   

    简单的理解,就是当作为方法的参数时,a可以完全看作A类型。
    但是当作为对象使用时。a应当从创建时的实例类型开始选择属性与方法。