JAVA多态的事例
2015-09-08 10:54
316 查看
以下是关于JAVA多态的小事例:
输出结果:
解析:
1.实例对象为A,参数为对象B,B为A的子类。执行A.class中show(A obj)
2.同上
3.实例对象为A,参数为对象D,执行A.class中show(D obj)
4.实例对象依然为A,参数为B,本应执行A.class中show(A obj),但是,B.class重写了show(A obj),所以执行B.class show(A obj)
5.同上
6.执行A.class show(D obj) B中并没有重写。
7,8.实例对象为B,参数为B或者B的子类,执行show(B obj)
9.实例对象为B,参数为D,因为B继承自A,也可以执行A中的show(D obj)
关于多态的概念:
多态:父类型的引用可以指向子类型的对象。
比如 A a = new B();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。
(注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)
如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将a转换为子类B类型的引用。
class A ...{ 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
解析:
1.实例对象为A,参数为对象B,B为A的子类。执行A.class中show(A obj)
2.同上
3.实例对象为A,参数为对象D,执行A.class中show(D obj)
4.实例对象依然为A,参数为B,本应执行A.class中show(A obj),但是,B.class重写了show(A obj),所以执行B.class show(A obj)
5.同上
6.执行A.class show(D obj) B中并没有重写。
7,8.实例对象为B,参数为B或者B的子类,执行show(B obj)
9.实例对象为B,参数为D,因为B继承自A,也可以执行A中的show(D obj)
关于多态的概念:
多态:父类型的引用可以指向子类型的对象。
比如 A a = new B();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。
(注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)
如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将a转换为子类B类型的引用。
相关文章推荐
- 使用Maven来管理项目-Maven安装配置(一)
- Jackson 框架,JSON和java对象的互相转换
- java字符串
- JDK环境变量配置
- JVM基础 之java内存管理以及GC
- spring 解读之 DI 、AOP
- JVM基础 之JAVA自带监控工具的介绍
- struts2自定义拦截器
- Thinking in java 之:迭代器Iterator
- Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(2) 自己封装的Calendar接口 - 跨到对岸去
- Package javax.ws.rs
- JVM基础 之温绍锦讲Java虚拟机基础
- Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(1) Calendar - 跨到对岸去
- spring mvc controller 获取不到@Value处理方法
- java 项目导入外部 jar包
- java基础:位运算用法之保存多选的表单项
- JVM基础 之The Java HotSpot Performance Engine Architecture
- JVM基础 之Java HotSpot虚拟机中的内存管理
- 使用Spring的NamedParameterJdbcTemplate完成DAO操作
- Spring4新特性——注解、脚本、任务、MVC等其他特性改进