上一篇博客(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是猫的内容,没法向下转型到狗去。猫变不成狗
}
}

多态问题的内存图解如下:

《java入门第一季》之面向对象(多态向下转型)的更多相关文章

  1. 《java入门第一季》之tcp协议下的网络编程c/s实现通信交互

    需求:客户端向服务器发送数据,服务器端收到数据后向客户端返回数据: 还是使用两台电脑,一台客户端,一台服务器. 客户端代码: import java.io.IOException; import ja ...

  2. 《java入门第一季》之tcp协议下的编程实现键盘录入数据不断地往服务器端发送数据案例

    这里要封装通道流,封装键盘录入数据流. 同样地,还是两台电脑.一个客户端,一个服务器. 客户端代码: import java.io.BufferedReader; import java.io.Buf ...

  3. 《java入门第一季》之tcp协议下的网络编程

    tcp协议相对于udp更加安全. 首先看一下需求:服务器端开启,多个客户端同时向服务器发送数据,看哪个客户端先到达. 说明:这里我开启三个电脑实验,一台电脑写服务器端的程序,两台电脑开客户端的程序.服 ...

  4. 《java入门第一季》之UDP协议下的网络编程小案例

    需求,一台电脑发送数据,其他电脑都可以收到该数据.使用广播地址. 发送端: import java.io.BufferedReader; import java.io.IOException; imp ...

  5. 《java入门第一季》之UDP协议下的网络编程详解

    首先看一下UDP协议的图解: 可以看到,分为发送端和接收端程序. 直接上代码: 发送端程序: import java.io.IOException; import java.net.DatagramP ...

  6. JAVA入门第一季(mooc-笔记)

    笔记相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第一季 ...

  7. Java入门第一季——从此投身Java??

    找工作告一段落. 最后的工作呢,和java紧密相关,也是阴差阳错,不过都是软件开发,都好了,不过以后侧重点肯定是在java这边,php有机会还是一直学下去的,那么美的说~ Java开发第一季  一.简 ...

  8. 《java入门第一季》之面向对象(重头戏多态)

    接下来介绍java第三大特性--多态性 /* 多态:同一个对象(事物),在不同时刻体现出来的不同状态. 举例: 猫是猫,猫是动物. 水(液体,固体,气态). 多态的前提: A:要有继承关系. B:要有 ...

  9. 《java入门第一季》之面向对象(多态练习)

    接下来经过一个例子,对多态问题加深印象: 猫狗案例. /* 多态练习:猫狗案例 */ class Animal { public void eat(){ System.out.println(&quo ...

随机推荐

  1. IDEA中Git的使用

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...

  2. Ruby方法参数默认值的一个小技巧在Rails中的应用

    我们需要生成一个gravatar格式的html.image标示,于是写了如下方法: def gravatar_for(user) gravatar_id = Digest::MD5::hexdiges ...

  3. java中static特殊性和final(static成员直接被访问,this不能用在static方法中,static不可访问非static)

    java的static关键字 java中,static修饰的成员变量和成员方法叫静态变量和静态方法,不依赖类特定的实例,被类的所有实例共享. 静态变量或类变量 和 实例变量,区别是: 静态变量在内存中 ...

  4. 在java程序中实现发送邮件的功能

    最近比较忙,在做一个人事管理系统的项目,在这项目需求中,需要一个发送邮件的功能.这个时候我们可以使用javamail的jar包来实现完美需要的功能,在这里简单的分享一个最基础的发邮件功能. 首先我们需 ...

  5. DJango内建模板转向jinja2的小脚本

    import re,os def org(path=os.getcwd(),fs=None,preview=True): fs = fs or [] for root,dirs,files in os ...

  6. EJB3基本概念、运行环境、下载安装与运行jboss

    EJB3基本概念 什么是EJB: EJB(EnterpriceJavaBeans)是一个用于分布式业务应用的标准服务端组件模型.采用EJB架构编写的应用是可伸的.事务性的.多用户安全的.采用EJB编写 ...

  7. JQuery插件使用之Validation 快速完成表单验证的几种方式

    JQuery的Validation插件可以到http://plugins.jquery.com/上去下载.今天来分享一下,关于这个插件的使用. 简易使用 这第一种方式可谓是傻瓜式的使用,我们只需要按照 ...

  8. Struts 1 之<html>标签库

    <html:html>标签 <html:html>标签用于在网页开头生成HTML的<html>元素,它只有一个用于显示用户语言的lang属性: <html:h ...

  9. UNIX网络编程——UNIX域套接字编程和socketpair 函数

    一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...

  10. Dalvik虚拟机

    Dalvik虚拟机是google专门为android平台开发的一个java虚拟机,但它并没有使用JVM规范.Dalvik虚拟机主要完成对象生命周期的管理.线程管理.安全和异常管理以及垃圾回收等重要功能 ...