网站首页 > java教程 正文
首先,java的转型是基于继承的基础上的,转型的使用一般在多态中。关于在转型中最重要的一点那就是:父类引用指向子类对象;而子类引用不能指向父类对象
要充分的了解向上转型与向下转型,我们先说下什么是多态
多态的定义:
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)简而言之就是:对于同一动作做出的响应产生不同的结果
多态存在的必要条件:
- 在继承的基础上
- 要有重写
- 父类引用指向子类对象(即向上转型)
多态存在的好处:
- 可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
- 可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。
- 接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
- 灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
多态的实现方式:继承和接口
继承实现多态:
- 对于指向子类对象的父类引用,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。
- 如果父类对象是抽象类,则继承了该抽象类的子类必须父类中的所有抽象方法
接口实现多态:
- 在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法
多态分类:
- 编译时多态:其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态;
- 运行时多态:而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。 对于多态的实现主要是基于动态绑定技术
示例:
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
向上转型与向下转型
一个简单的例子:有2个类,Animal是父类,Pig类继承自Father。
Animal a1 = new Pig();//父类引用a指向子类对象 Pig p1 = (Pig)a //子类对象的父类引用 a 赋给子类引用 p2 Animal a2 = new Animal(); Pig p2 = (Pig)a2//子类引用p2指向父类对象a2;(严格的说这里的a2是指的父类引用而不是父类的对象)
- 向上转型:父类引用指向子类对象,而子类引用不能指向父类对象
- 向下转型:子类对象的父类引用 赋给子类引用
向上转型在代码中的实现
package casting; /** * Animal父类 * @author wangyu * * @create date:2017年10月12日 */ public class Animal { public void eat(){ System.out.println("animal eatting..."); } } /** * 子类 */ class Birds extends Animal{ //重写父类方法 @Override public void eat() { System.out.println("bird eatting..."); } public void fly(){ System.out.println("bird fly..."); } } /** * Human子类 * @author wangyu * * @create date:2017年10月12日 */ public class Human { public void sleep() { System.out.println("Human sleep.."); } } class Male extends Human { @Override public void sleep() { System.out.println("Male sleep.."); } } class Female extends Human { @Override public void sleep() { System.out.println("Female sleep.."); } } /** * 测试类 * @author wangyu * * @create date:2017年10月12日 */ public class Main { public static void main(String[] args) { Animal b=new Birds(); //向上转型 b.eat(); //! error: b.fly(); b虽指向子类对象,但此时丢失fly()方法 dosleep(new Male()); dosleep(new Female()); } public static void dosleep(Human h) { //这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。使代码简洁 h.sleep(); } } 运行结果: bird eatting... Male sleep.. Female sleep..
向下转型在代码中的实现:
public static void main(String[] args) { Animal a = new Birds(); //向上转型 a.eat(); Birds b = (Birds)a;//向下转型 b.fly(); b.eat(); Animal a2 = new Animal();//不安全的向下转型,编译无错但会运行会出错 if(a2 instanceof Birds){ Birds b2 = (Birds)a2; b2.fly(); b2.eat(); } /* * 运行出错: Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl at com.wensefu.other1.Main.main() 如代码所示,可以通过instanceof来防止出现异常。 */ } 运行结果: bird eatting... bird fly... bird eatting...
以上就是我对多态及向上向下转型的理解,如有不对的地方欢迎指正,谢谢大家支持
猜你喜欢
- 2024-10-11 SpringBoot整合Nacos配置中心加载原理二
- 2024-10-11 Java核心修饰符——abstract修饰符与抽象类、抽象方法
- 2024-10-11 绝对的JAVA面试干货(java juc 面试)
- 2024-10-11 Java面试集合(三)-1(基础篇java集合面试专用)
- 2024-10-11 Java之路-10 API、Scanner类、Random类、Math类
- 2024-10-11 JAVA面试基础知识点(java面试必背)
- 2024-10-11 java面试题及答案2022,java2022最新面试题及答案
- 2024-10-11 java向上转型和向下转型(java向上转型调用的是子类还是父类属性)
- 2024-10-11 「Java基础11」常用API(java基础知识点整理汇总)
- 2024-10-11 java基础总结(java基础总结心得)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)