请问:
我以前对多态的理解是:
如:A a = new B();B是A的子类 编译器在编译期并不知道a引用指向的是一个B类对象 编译器是无法识别的 编译器认为a指向的是一个A类对象 但在运行时侯虚拟机就可以知道并识别出来了而看到think in java上又看到这样一句:
多态只发生在调用方法的时候难道在运行的时候虚拟机并不知道a指向的是一个B类对象 只有在调用方法的时候才知道吗
谢谢
我以前对多态的理解是:
如:A a = new B();B是A的子类 编译器在编译期并不知道a引用指向的是一个B类对象 编译器是无法识别的 编译器认为a指向的是一个A类对象 但在运行时侯虚拟机就可以知道并识别出来了而看到think in java上又看到这样一句:
多态只发生在调用方法的时候难道在运行的时候虚拟机并不知道a指向的是一个B类对象 只有在调用方法的时候才知道吗
谢谢
2. 对于 A a = new B(); B extends A 假如 A 有一方法 test() B 类把它给覆盖了,当运行到 a.test() 时究竟是调用 A 类中定义的 test 方法还是 B 类定义的 test 方法要看 a 具体引用的对象的类型,根据实际类型决定最终要调用 B 类中的 test 方法,此为多态。而在执行到 a.test() 之前不需要知道 a 引用的对象究竟是何类型。而动态绑定是实现多态的一种手段。
A a = new B(); B extends A
对于这个例子。声明的时候,a的类型为A。但是a所指向的实例为A的子类,即B。
也就是说,虽然a是B的实例,但是仍然是A类型。
方法自然都是A类型的方法。
当程序运行到a.test()的时候,虚拟机会去寻找对象可用的名为test()的方法。
此时如果B类型已经覆盖了父类的该方法,虚拟机首先捕捉到该方法并执行。
如果B中找不到。则会继续向上寻找父类的名为test()的方法。
但是当作为对象使用时。a应当从创建时的实例类型开始选择属性与方法。