java 下溯造型_Java——上溯造型下溯造型
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——上溯造型下溯造型相关推荐
- java运行class文件_java命令行下运行class文件
今天碰到了一个很变态的问题,写了一个很简单的HelloWord.java,内容如下: package com.yanjiuyanjiu; public class HelloWorld { publi ...
- java src 文件路径_java获取src下文件路径和获取webRoot下文件路径
获取src下的fileurl.properties文件路径 this.getClass().getResource("/fileurl.properties").getPath() ...
- JAVA生产环境验证_Java生产环境下性能监控与调优详解
本课程将为你讲解如何在生产环境下对Java应用做性能监控与调优:通过本课程,你将掌握多种性能监控工具应用,学会定位并解决诸如内存溢出.cpu负载飙高等问题:学会线上代码调试,Tomcat.Nginx, ...
- java 线程池 包_Java并发包下线程池类小结
并发包下的线程池技术虽然常用,但是知识点较多易忘.所以,参考网络资源做了一个小结,便于复习. 1.Executor接口 用于执行已提交的Runnable任务. Paste_Image.png 2.Ex ...
- java窗体怎么实现下拉菜单_java之swing下拉菜单实现方法
本文实例讲述了java之swing下拉菜单实现方法.分享给大家供大家参考.具体如下: import java.awt.*; import javax.swing.*; import java.awt. ...
- java 模拟键盘输入_Java 在windows 下模拟鼠标键盘的输入
Java提供了一个很好的自动化测试类供我们去模拟鼠标键盘消息.以下是Robot的主要方法 Robot类的主要方法详细信息 1.mouseMove(int x,int y)将鼠标指针移动到给定屏幕坐标: ...
- ubuntu java 全屏显示_java 在ubuntu下实现全屏,上面的状态栏依然显示。如下图,不想要上面的状态栏...
源代码://-------------------------------------TestLogIn类importjavax.swing.*;importjava.awt.*;publicclas ...
- java util包类_java.util包下的类及常用方法
1.日期类 Date类 常用方法 创建日期对象:Date date = new Date ( ) ; 获取当前时间 以标准格式:date 获取当前时间的毫秒数:date.getTIme ( ) ...
- Java的上溯、下溯
2019独角兽企业重金招聘Python工程师标准>>> 抽象方法:只有方法声明没有实现,有一个抽象方法的的类叫抽象类 修饰符: 例: abstract class Operator{ ...
最新文章
- 十年编程经验输给新晋AI工程师,6个月我们带你绝地反击
- WebLogic的下载地址http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-main-097127.html
- csv数据去重 python_python批量查询、汉字去重处理CSV文件
- OpenCV cvReleaseImage把图像怎么样了?
- Javascript的面对对象的理解 【下】(prototype的使用)
- 用js将form表单同时提交到两个不同页面的方法
- Mysql学习总结(53)——使用MySql开发的Java开发者规范
- k8s核心技术-Controller(Deployment)控制器对pod的管理实现_升级回滚和弹性伸缩---K8S_Google工作笔记0030
- PyTorch出现RuntimeError: Function AddBackward0 returned an invalid gradient at index 1
- html元素上下移动,一个可以上下摆动的html元素
- CAN:CANape使用Function处理数据
- Python笔记 之 矩阵元素选取
- 计算机二级基础知识占多少分,计算机二级MS考试题目占分数
- 特种作业操作电工作业2021年电力电缆考试题库
- 2022年自考专业考试(计算机应用)离散数学模拟冲刺题
- 【强烈推荐】国土档案管理信息系统产品使用说明书系列目录【附下载地址】
- w10恢复出厂设置_笔记本电脑w10怎么恢复出厂设置
- 2019最新activiti6.0工作流搭建平台
- 2022年十一届认证杯B题
- mplayer - Linux下的电影播放器