原文地址:http://blog.csdn.net/danielinbiti/article/details/44047007
JAVA多态
一、相关的类结构
- class A ...{ //create by danielinbiti
- public String show(D obj)...{
- return ("A and D");
- }
- public String show(A obj)...{
- return ("A and A");
- }
- }
- class B extends A...{
- public String show(B obj)...{
- return ("B and B");
- }
- public String show(A obj)...{
- return ("B and A");
- }
- }
- class C extends B...{}
- class D extends B...{}
二、测试运行
- A a1 = new A();
- A a2 = new B();
- B b = new B();
- C c = new C();
- D d = new D();
- System.out.println(a1.show(b)); ①
- System.out.println(a1.show(c)); ②
- System.out.println(a1.show(d)); ③
- System.out.println(a2.show(b)); ④
- System.out.println(a2.show(c)); ⑤
- System.out.println(a2.show(d)); ⑥
- System.out.println(b.show(b)); ⑦
- System.out.println(b.show(c)); ⑧
- System.out.println(b.show(d)); ⑨
- ① A and A
- ② A and A
- ③ A and D
- ④ B and A
- ⑤ B and A
- ⑥ A and D
- ⑦ B and B
- ⑧ B and B
- ⑨ A and D
四、总结
以A a2=new B()为例。
1、a2只能访问A的信息(指的是编译期编译器只知道a2是A类型,不知道a2具体子类对象,只有运行期才知道指向什么对象),而子类重写的方法,父类中也存在,即B重写的方法,A里也有(如果B里有但是A里没有的方法,a2也不能直接调用),所以a2可以访问,但是调用的时候(注意这里指的是运行期),a2实际指向的是B对象,所以调用的是B对象的同名同类型参数方法。所以a2.show(b)调用的是show(A obj),因为A引用不到show(B obj)。
注:编译期是编译器检查语法和类型,运行期是解析器解析伪代码为机器指令而执行,编译期编译器会检查a2的访问范围,也就是a2的访问不超过A的信息就不会出错,运行期解析器会解析方法的代码指令。