《java入门第一季》之面向对象(多态向下转型)
来源:互联网 发布:大数据 感知 编辑:程序博客网 时间:2024/05/22 12:54
上一篇博客(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是猫的内容,没法向下转型到狗去。猫变不成狗}}
多态问题的内存图解如下:
1 0
- 《java入门第一季》之面向对象(多态向下转型)
- java面向对象之向上转型和向下转型
- java语言基础(37)——面向对象(多态中的向上转型和向下转型)
- 重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)
- 《java入门第一季》之面向对象(匿名对象)
- 《java入门第一季》之面向对象
- 《java入门第一季》之面向对象(重头戏多态)
- 《java入门第一季》之面向对象(多态练习)
- 《java入门第一季》之面向对象多态面试题(多态收尾)
- 《java入门第一季》之面向对象(构造方法)
- 《java入门第一季》之面向对象(成员方法)
- 《java入门第一季》之面向对象(static关键字)
- 《java入门第一季》之面向对象(继承)
- 《java入门第一季》之面向对象(继承)
- 《java入门第一季》之面向对象(继承总结)
- 《java入门第一季》之面向对象(final关键字)
- 《java入门第一季》之面向对象(谈谈接口)
- 《java入门第一季》之面向对象(接口收尾)
- 项目管理
- Windows配置NetBeans为SourceCodePro字体
- 单片机中使用C库函数记录
- Opengl ES 线的三角化
- Android API中被@hide注释的方法引用报错解决
- 《java入门第一季》之面向对象(多态向下转型)
- ExtJS自定义控件 之一:datetimefield控件
- Flask下拉列表与数据库同步
- leetcode.279. Perfect Squares
- 今天经理给我讲了好多东西(spring mvc)
- java底层知识(3)--CPU 高速缓存
- 版本管理
- 创建一个内容提供者Creating a Content Provider——翻译总结自developer.android.com
- Android5.0(L)输入法表情界面㊗和㊙显示框框