java多态学习

最近在重新看java,感觉到多态还有很多不懂的地方,看到这篇文章,有所启发。

JAVA多态

一、相关的类结构点击打开链接

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class A ...{  //create by danielinbiti  
  2.          public String show(D obj)...{    
  3.                 return ("A and D");    
  4.          }     
  5.          public String show(A obj)...{    
  6.                 return ("A and A");    
  7.          }     
  8. }     
  9. class B extends A...{    
  10.          public String show(B obj)...{    
  11.                 return ("B and B");    
  12.          }    
  13.          public String show(A obj)...{    
  14.                 return ("B and A");    
  15.          }     
  16. }    
  17. class C extends B...{}                                                                    
  18. class D extends B...{}  

二、测试运行

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. A a1 = new A();    
  2. A a2 = new B();    
  3. B b = new B();    
  4. C c = new C();     
  5. D d = new D();     
  6. System.out.println(a1.show(b));   ①    
  7. System.out.println(a1.show(c));   ②    
  8. System.out.println(a1.show(d));   ③    
  9. System.out.println(a2.show(b));   ④    
  10. System.out.println(a2.show(c));   ⑤    
  11. System.out.println(a2.show(d));   ⑥    
  12. System.out.println(b.show(b));    ⑦    
  13. System.out.println(b.show(c));    ⑧    
  14. System.out.println(b.show(d));    ⑨  
三、运行结果

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ①   A and A  
  2. ②   A and A  
  3. ③   A and D  
  4. ④   B and A  
  5. ⑤   B and A  
  6. ⑥   A and D  
  7. ⑦   B and B  
  8. ⑧   B and B  
  9. ⑨   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的信息就不会出错,运行期解析器会解析方法的代码指令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值