《java入门第一季》之面向对象(多态向下转型)
2016-05-06 12:15
666 查看
上一篇博客(http://blog.csdn.net/qq_32059827/article/details/51328638)最后对多态的弊端做了显示,这里解决这个弊端。如下:
既然向下转型也会出现问题,接下来就演示一个出问题的向下转型问题。(这个问题是因为语法不规范导致的)
多态问题的内存图解如下:
/* 多态的弊端: 不能使用子类的特有功能。 我就想使用子类的特有功能?行不行? 行。 怎么用呢? A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了) B:把父类的引用强制转换为子类的引用。(向下转型) 对象间的转型问题: 向上转型: Fu f = new Zi(); 向下转型:(容易出现问题) Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。类型要匹配 不可行案例:Ren r = (cat) Cat();猫转成人显然不可能的。 */ class Fu { public void show() { System.out.println("show fu"); } } class Zi extends Fu { public void show() { System.out.println("show zi"); } public void method() { System.out.println("method zi"); } } class DuoTaiDemo4 { public static void main(String[] args) { //测试 Fu f = new Zi(); f.show(); //f.method();//找不到符号,父类中没有method() //创建子类对象,可以,但是很多时候不合理。而且,太占内存了 //Zi z = new Zi(); //z.show(); //z.method(); Zi z = (Zi)f;//注意格式哦! z.show(); z.method(); } }
既然向下转型也会出现问题,接下来就演示一个出问题的向下转型问题。(这个问题是因为语法不规范导致的)
/* ClassCastException:类型转换异常 一般在多态的向下转型中容易出现 */ class Animal { public void eat(){} } class Dog extends Animal { public void eat() {} public void lookDoor() { } } class Cat extends Animal { public void eat() { } public void playGame() { } } class DuoTaiDemo5 { public static void main(String[] args) { //内存中的是狗 Animal a = new Dog(); System.out.println(a); Dog d = (Dog)a;//向下转型了 System.out.println(d); //内存中是猫 //Animal a = new Cat();Animal a记住不可以这样定义。错误: 已在方法 main(String[])中定义了变量 a。个人理解的是发生变量赋值“冲突” //(希望看到的读者一起讨论上边报错的具体原因) a = new Cat();//向下转型 System.out.println(a); Cat c = (Cat)a;//向下转型 System.out.println(c); //内存中是猫 //Dog dd = (Dog)a; //ClassCastException,a是猫的内容,没法向下转型到狗去。猫变不成狗 } }
多态问题的内存图解如下:
相关文章推荐
- Spring基础 Quartz的配置
- Spring 声明式事务配置管理方法
- Spring基础 注解实现Bean依赖注入
- java底层知识(3)--CPU 高速缓存
- 今天经理给我讲了好多东西(spring mvc)
- Windows配置NetBeans为SourceCodePro字体
- 怎么在eclipse中安装properties插件(国际化使用)
- java枚举类型enum的使用
- Java 反射机制
- POI实现Excel的导出
- java获取时间
- Spring+SpringMVC+Mybatis 多数据源整合(转)
- JDK 1.7 下载地址
- eclipse中svn插件的安装
- Java之模板方法模式(Template Method)
- Struts2 属性驱动与模型驱动
- Java生成缩略图之Thumbnailator
- java高级程序设计(第十周)
- java read com port
- JAVA真正理解实现多线程的两个方法(Thread Runnable)