上一篇博客(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. 关于XML中:XmlNode和XmlElement的涵义及不同之处
  2. SQL Server 2016 CTP2.3 的关键特性
  3. iOS开发之功能模块--用runtime给UIView类别拓展PressMenu工具
  4. VS2010 MFC对Excel的操作
  5. ios更新UI时请尝试使用performSelectorOnMainThread方法
  6. asp.net的sessionState节点详解
  7. C# System.AppDomain类
  8. RS485通讯协议的应用 (转)
  9. 学习ASP.NET MVC(十一)——分页
  10. 01 The Learning Problem
  11. codeforces347B
  12. Python之ftp服务器
  13. unity3d 第一人称脚本解释MouseLook
  14. [8]windows内核情景分析--窗口消息
  15. 170609、Nginx配置文件详细说明
  16. “互联网+”背景下使用微信公众号增强班主任工作与整合教学资源(泰微课)
  17. What is the difference between inverse converse and reverse?
  18. java sleep()和wait()的区别
  19. Android 函数回调
  20. 题解报告:hdu 4135 Co-prime(容斥定理入门)

热门文章

  1. Java语言程序设计-Markdown格式作业模板
  2. WiFi文件上传框架SGWiFiUpload
  3. Programming In Scala笔记-第十七章、Scala中的集合类型
  4. Picasso 完美兼容 OkHttp3.3,缓存优化两不误
  5. Windows Python requests 详细模块安装方法
  6. ssh用法及命令
  7. android 网络连接 HttpGet HttpPost方法
  8. Compass 更智能的搜索引擎(1)--入门
  9. (Android自定义View)来来来,一起再撸一个Material风格loadingView。
  10. API创建/更新员工联系电话