public abstract class Animal {

public abstract void speak();

public void eat(){

// 吃吃吃!!!

}

}

public interface DoorGod {

void guard();

}

public class Cat extends Animal {

@Override

public void eat() {

try {

Thread.sleep( 1000 );

} catch (InterruptedException e) {

e.printStackTrace();

}

super .eat();

}

@Override

public void speak() {

System.out.println( " 喵喵 " );

}

}

public class Dog extends Animal implements DoorGod{

@Override

public 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

异常,对于测试来说,这样的错误也是很难检测的。

java 下溯造型_Java——上溯造型下溯造型相关推荐

  1. java运行class文件_java命令行下运行class文件

    今天碰到了一个很变态的问题,写了一个很简单的HelloWord.java,内容如下: package com.yanjiuyanjiu; public class HelloWorld { publi ...

  2. java src 文件路径_java获取src下文件路径和获取webRoot下文件路径

    获取src下的fileurl.properties文件路径 this.getClass().getResource("/fileurl.properties").getPath() ...

  3. JAVA生产环境验证_Java生产环境下性能监控与调优详解

    本课程将为你讲解如何在生产环境下对Java应用做性能监控与调优:通过本课程,你将掌握多种性能监控工具应用,学会定位并解决诸如内存溢出.cpu负载飙高等问题:学会线上代码调试,Tomcat.Nginx, ...

  4. java 线程池 包_Java并发包下线程池类小结

    并发包下的线程池技术虽然常用,但是知识点较多易忘.所以,参考网络资源做了一个小结,便于复习. 1.Executor接口 用于执行已提交的Runnable任务. Paste_Image.png 2.Ex ...

  5. java窗体怎么实现下拉菜单_java之swing下拉菜单实现方法

    本文实例讲述了java之swing下拉菜单实现方法.分享给大家供大家参考.具体如下: import java.awt.*; import javax.swing.*; import java.awt. ...

  6. java 模拟键盘输入_Java 在windows 下模拟鼠标键盘的输入

    Java提供了一个很好的自动化测试类供我们去模拟鼠标键盘消息.以下是Robot的主要方法 Robot类的主要方法详细信息 1.mouseMove(int x,int y)将鼠标指针移动到给定屏幕坐标: ...

  7. ubuntu java 全屏显示_java 在ubuntu下实现全屏,上面的状态栏依然显示。如下图,不想要上面的状态栏...

    源代码://-------------------------------------TestLogIn类importjavax.swing.*;importjava.awt.*;publicclas ...

  8. java util包类_java.util包下的类及常用方法

    1.日期类 Date类 常用方法 ​创建日期对象:Date date = new Date ( ) ; ​获取当前时间 以标准格式:date ​获取当前时间的毫秒数:date.getTIme ( ) ...

  9. Java的上溯、下溯

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

最新文章

  1. 十年编程经验输给新晋AI工程师,6个月我们带你绝地反击
  2. WebLogic的下载地址http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-main-097127.html
  3. csv数据去重 python_python批量查询、汉字去重处理CSV文件
  4. OpenCV cvReleaseImage把图像怎么样了?
  5. Javascript的面对对象的理解 【下】(prototype的使用)
  6. 用js将form表单同时提交到两个不同页面的方法
  7. Mysql学习总结(53)——使用MySql开发的Java开发者规范
  8. k8s核心技术-Controller(Deployment)控制器对pod的管理实现_升级回滚和弹性伸缩---K8S_Google工作笔记0030
  9. PyTorch出现RuntimeError: Function AddBackward0 returned an invalid gradient at index 1
  10. html元素上下移动,一个可以上下摆动的html元素
  11. CAN:CANape使用Function处理数据
  12. Python笔记 之 矩阵元素选取
  13. 计算机二级基础知识占多少分,计算机二级MS考试题目占分数
  14. 特种作业操作电工作业2021年电力电缆考试题库
  15. 2022年自考专业考试(计算机应用)离散数学模拟冲刺题
  16. 【强烈推荐】国土档案管理信息系统产品使用说明书系列目录【附下载地址】
  17. w10恢复出厂设置_笔记本电脑w10怎么恢复出厂设置
  18. 2019最新activiti6.0工作流搭建平台
  19. 2022年十一届认证杯B题
  20. mplayer - Linux下的电影播放器

热门文章

  1. TP6如何输出JSON数据
  2. 微信小程序悬浮可拖动客服组件
  3. 【软件测试】白盒测试与黑盒测试
  4. BiSeNet脸部解析
  5. 三肽-1在美容丰胸上的作用
  6. 实战演示:使用Python编写人脸识别测试代码,让你的应用拥有智能感知能力
  7. 如何刷新微信服务器小程序版本,微信小程序版本自动更新
  8. C/C++输入一行每隔一个空格一个数据
  9. 人体行为识别 动作属性
  10. android三星note20.6,安卓新机皇?三星Note20系列快速上手【上篇】