Java——上溯造型下溯造型
public abstract class Animal {public abstract void speak();public void eat(){// 吃吃吃!!! }
}
public interface DoorGod {void guard();
}
public class Cat extends Animal {@Overridepublic void eat() {try {Thread.sleep( 1000 );} catch (InterruptedException e) {e.printStackTrace();}super .eat();}@Overridepublic void speak() {System.out.println( " 喵喵 " );}}
public class Dog extends Animal implements DoorGod{@Overridepublic void speak() {System.out.println( " 汪汪 " );}public void guard() {while ( true ){System.out.println( " 汪汪 " );}}}
其中Animal 为基类,定义speak 和eat 方法,eat 方法给出了空实现; DoorGod 为门神接口,定义了 guard 方法来守护家门; Cat 为继承Animal 的子类,这里假定猫有挑食的习惯,在eat 中要耽搁点时间看看伙食;Dog 也为继承Animal 的子类,同时它实现了DoorGod 接口来守护家门。
先说说上溯造型(upcasting)。这个术语缘于继承关系图的传统画法:将基类至于顶部,而向下发展的就是派生类。根据上面的sample,我给出下面的一个小应用:
public class Main {public static void upcasting(Animal animal){animal.speak();animal.eat();}public static void main(String[] args) {Animal dog1 = new Dog();upcasting(dog1);Dog dog2 = new Dog();upcasting(dog2);}}
由于upcasting(Animal animal)方法的参数是 Animal类型的,因此如果传入的参数是 Animal的子类,传入的参数就会被转换成父类Animal类型,这样你创建的Dog对象能使用的方法只是Animal中的签名方法;也就是说,在上溯的过程中,Dog的接口变窄了,它本身的一些方法(例如实现了 DoorGod的guard方法)就不可见了。如果你想使用Dog中存在而Animal中不存在的方法(比如guard方法),编译时不能通过的。由此可见,上溯造型是安全的类型转换。另一方面,虽然upcasting(Animal animal)方法的参数是 Animal类型,但传入的参数可以是Animal的派生类(这也是OO编程中惯用的编程方法),这里面就有个对象的类型识别问题,也就是运行时类型识别(run-time type identification,缩写为RTTI) ,这也可以单独写一篇文章了,《Thinking in Java》中的第10章详细地阐述了RTTI。
相对于类型转换安全的上溯造型,下溯造型就未必是安全的了。我们经常会做些强制类型转换的事情,有时我们也会无意间遇到 ClassCastException的转换异常(从这一点来说,我们应该多用范型来避免不安全的类型转换)。例如:
public static void downcasting(Animal animal){//DoorGod doorGod = (DoorGod)animal;if(animal instanceof DoorGod){DoorGod doorGod = (DoorGod)animal;doorGod.guard();}if(animal instanceof Cat){Cat cat = (Cat)animal;cat.speak();}}
如果没有采取措施(上面使用的措施是 instanceof )判断对象的类型,那么向下的强制转换就是不安全的。这种转换错误在编译时是不能检测出来的,只有在运行时才会抛出 ClassCastException 异常,对于测试来说,这样的错误也是很难检测的。
来源:http://www.blogjava.net/kafka0102/archive/2007/05/21/118998.html
Java——上溯造型下溯造型相关推荐
- java 下溯造型_Java——上溯造型下溯造型
public abstract class Animal { public abstract void speak(); public void eat(){ // 吃吃吃!!! } } public ...
- Java的上溯、下溯
2019独角兽企业重金招聘Python工程师标准>>> 抽象方法:只有方法声明没有实现,有一个抽象方法的的类叫抽象类 修饰符: 例: abstract class Operator{ ...
- [Java初学]Java上溯造型(upcasting)与下溯造型(Downcasting)
Java上溯造型(upcasting)与下溯造型(Downcasting) 上溯造型(upcasting) 这个术语缘于继承关系图的传统画法:将基类至于顶部,而向下发展的就是派生类. 文章使用的完整代 ...
- java上溯造型与下溯造型
Java的多态性 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作 ...
- Java 的上溯造型和下溯造型以及举例,以及判断参数等指向的类
(一) 先给出个例子,代码如下: /** * @author WangQun * 动物抽象类 */ abstract class Animal { public abstract void speak ...
- java 下溯造型_Java 的上溯造型和下溯造型以及举例,以及判断参数等指向的类
(一) 先给出个例子,代码如下: /** * @author WangQun * 动物抽象类 */ abstract class Animal { public abstract void speak ...
- 学习上溯造型和下溯造型 【转载一篇】
题按:做了几年的java程序,却很难说对基本的OO概念都有理解.即便每天都写的代码中,也很难说清楚其中到底运用了怎样的概念和思想.前日的考试中看到关于上溯造型与下溯造型的问题,就查了些资料,集中说一下 ...
- 上溯造型、下溯造型的理解
(上溯造型定义:java允许把一个子类对象直接复制给一个父类引用变量,自动完成类型转换,这种语法现象称为上溯造型. 下溯造型回到它自己所在的类(强制转换):一个对象被溯型为父类或接口后还可以再被下溯造 ...
- 上溯造型和下溯造性(解耦合)
上溯造型: 向上转型(Upcasting)- 子类转换为父类,自动转换: 前提 - 具有继承或实现关系: 向上转换损失了子类新扩展的属性和方法,仅可以使用从父类中继承的属性和方法 Animal a=n ...
最新文章
- Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)
- [导入]基类的复制控制函数
- java 采样_Java编程实现beta分布的采样或抽样实例代码
- java常见异常类图(分类了Error/RuntimeExecption、check Exception)
- TC第一次成为room leader
- CentOS 6.5安装使用docker
- 无法访问udemy.com怎么办?
- tensorflow之control_dependencies
- DH加密通信python实现
- Cisco WLC 基础配置
- Sony电视投屏 Android,怎样把手机画面投影到电视上观看 乐播投屏使用方法
- uniapp微信小程序引用标准版交易组件
- Flutter 使用 ESC/POS蓝牙或以太网库控制热敏打印机
- vue中EventBus的实现原理
- 处理IRP的几种方式
- 内嵌式js微信扫码登录及自定义样式
- 2018年度最优秀mac软件及游戏推荐,个个万里挑一
- Python 进程间的通信
- 用python(numpy)复现matlab代码
- nike air max polska 2016 ważne jest
热门文章
- String比较字符串方法
- php网页怎么和PLC通讯,plc网络通讯方式和协议
- Sql Server 里的向上取整、向下取整、四舍五入取整的实例!
- Yolov3-v5正负样本匹配机制
- 刷脸支付青蛙Pro打通微信卡包小程序
- 视频教程-网络营销-网站盈利方式/淘宝客网络赚钱/广告联盟-其他
- HTML网页调用海康摄像头,[FastVideo]Web Html5 无插件方式连接海康摄像头[2]
- Minor GC、Major GC与Full GC讲解
- DFD图转换成SC图
- SIGSEGV (Segmentation fault)