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——上溯造型下溯造型相关推荐

  1. java 下溯造型_Java——上溯造型下溯造型

    public abstract class Animal { public abstract void speak(); public void eat(){ // 吃吃吃!!! } } public ...

  2. Java的上溯、下溯

    2019独角兽企业重金招聘Python工程师标准>>> 抽象方法:只有方法声明没有实现,有一个抽象方法的的类叫抽象类 修饰符: 例: abstract class Operator{ ...

  3. [Java初学]Java上溯造型(upcasting)与下溯造型(Downcasting)

    Java上溯造型(upcasting)与下溯造型(Downcasting) 上溯造型(upcasting) 这个术语缘于继承关系图的传统画法:将基类至于顶部,而向下发展的就是派生类. 文章使用的完整代 ...

  4. java上溯造型与下溯造型

    Java的多态性 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作 ...

  5. Java 的上溯造型和下溯造型以及举例,以及判断参数等指向的类

    (一) 先给出个例子,代码如下: /** * @author WangQun * 动物抽象类 */ abstract class Animal { public abstract void speak ...

  6. java 下溯造型_Java 的上溯造型和下溯造型以及举例,以及判断参数等指向的类

    (一) 先给出个例子,代码如下: /** * @author WangQun * 动物抽象类 */ abstract class Animal { public abstract void speak ...

  7. 学习上溯造型和下溯造型 【转载一篇】

    题按:做了几年的java程序,却很难说对基本的OO概念都有理解.即便每天都写的代码中,也很难说清楚其中到底运用了怎样的概念和思想.前日的考试中看到关于上溯造型与下溯造型的问题,就查了些资料,集中说一下 ...

  8. 上溯造型、下溯造型的理解

    (上溯造型定义:java允许把一个子类对象直接复制给一个父类引用变量,自动完成类型转换,这种语法现象称为上溯造型. 下溯造型回到它自己所在的类(强制转换):一个对象被溯型为父类或接口后还可以再被下溯造 ...

  9. 上溯造型和下溯造性(解耦合)

    上溯造型: 向上转型(Upcasting)- 子类转换为父类,自动转换: 前提 - 具有继承或实现关系: 向上转换损失了子类新扩展的属性和方法,仅可以使用从父类中继承的属性和方法 Animal a=n ...

最新文章

  1. Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)
  2. [导入]基类的复制控制函数
  3. java 采样_Java编程实现beta分布的采样或抽样实例代码
  4. java常见异常类图(分类了Error/RuntimeExecption、check Exception)
  5. TC第一次成为room leader
  6. CentOS 6.5安装使用docker
  7. 无法访问udemy.com怎么办?
  8. tensorflow之control_dependencies
  9. DH加密通信python实现
  10. Cisco WLC 基础配置
  11. Sony电视投屏 Android,怎样把手机画面投影到电视上观看 乐播投屏使用方法
  12. uniapp微信小程序引用标准版交易组件
  13. Flutter 使用 ESC/POS蓝牙或以太网库控制热敏打印机
  14. vue中EventBus的实现原理
  15. 处理IRP的几种方式
  16. 内嵌式js微信扫码登录及自定义样式
  17. 2018年度最优秀mac软件及游戏推荐,个个万里挑一
  18. Python 进程间的通信
  19. 用python(numpy)复现matlab代码
  20. nike air max polska 2016 ważne jest

热门文章

  1. String比较字符串方法
  2. php网页怎么和PLC通讯,plc网络通讯方式和协议
  3. Sql Server 里的向上取整、向下取整、四舍五入取整的实例!
  4. Yolov3-v5正负样本匹配机制
  5. 刷脸支付青蛙Pro打通微信卡包小程序
  6. 视频教程-网络营销-网站盈利方式/淘宝客网络赚钱/广告联盟-其他
  7. HTML网页调用海康摄像头,[FastVideo]Web Html5 无插件方式连接海康摄像头[2]
  8. Minor GC、Major GC与Full GC讲解
  9. DFD图转换成SC图
  10. SIGSEGV (Segmentation fault)