Java学习笔记15---instanceof与向下转型
感冒咳嗽停更了几天,今天恢复更新了。
先来看下instanceof与向下转型的概念:
1.instanceof
instanceof是一个二元操作符,用法是:boolean result = a instanceof ClassA,即判断对象a是否是类ClassA的实例,如果是的话,则返回true,否则返回false。
2.向下转型
对于向上转型,笔记12已经说明过了,即父类对象引用指向了子类对象;向下转型是指,子类的对象引用被赋值为父类对象引用,并且赋值时要进行显式的强制类型转换,而该父类对象引用必须是指向子类对象的;向下转型最终还是子类对象引用指向了子类对象,也就是说,向上转型后,再通过向下转型变回来;向上转型后丢失的属性和方法经过向下转型又可见了。关于向下转型的意义,请参考http://blog.csdn.net/xyh269/article/details/52231944。
用文字描述起来比较绕口,看下面的式子就好理解了。记Person为父类,Student为子类。
Person per = new Student(); //向上转型
Student stu = (Student) per; //向下转型
由于per本来指向的就是子类对象,所以可以通过显式的类型转换使stu也指向该子类对象。
对于下面的语句,则不能进行向下转型:
Person per1 = new Person();
Student stu1 = (Student) per1;
会出现下面的错误:
Exception in thread "main" java.lang.ClassCastException: human.Person cannot be cast to human.Student
at human.TestMain.main(TestMain.java:15)
因为per1指向的是父类对象,stu1是子类引用,而子类的属性数及方法数是大于父类的,所以是没法转换为子类对象的。
参考下面的内存图就比较直观了:

3.那么怎么判断能不能向下转型呢?
可以先用instanceof判断父类的对象引用是不是指向了子类的实例,是的话,则可以向下转型,否则就不可以。
作者: 蝉蝉
请尊重作者劳动成果,转载请在标题注明“转载”字样,并标明原文链接:
http://www.cnblogs.com/chanchan/p/7863173.html
4.下面是例子,代码如下:
package human;
public class TestMain {
public static void main(String[] args) {
Person per = new Person();
Person per2;
Student stu = new Student();
Student stu2;
per2 = stu;
stu2 = (Student) per2;
// stu2 = (Student) per;
if( per2 instanceof Student )
System.out.println("per2指向的是Student类的对象");
else
System.out.println("per2指向的不是Student类的对象");
if( per2 instanceof Person )
System.out.println("per2指向的是Person类的对象");
else
System.out.println("per2指向的不是Person类的对象");
if( per instanceof Student)
System.out.println("per指向的是Student类的对象");
else
System.out.println("per指向的不是Student类的对象");
if( per instanceof Person )
System.out.println("per指向的是Person类的对象");
else
System.out.println("per指向的不是Person类的对象");
if( stu2 instanceof Student )
System.out.println("stu2指向的是Student类的对象");
else
System.out.println("stu2指向的不是Student类的对象");
if( stu2 instanceof Person )
System.out.println("stu2指向的是Person类的对象");
else
System.out.println("stu2指向的不是Person类的对象");
if( stu instanceof Student )
System.out.println("stu指向的是Student类的对象");
else
System.out.println("stu指向的不是Student类的对象");
if( stu instanceof Person )
System.out.println("stu指向的是Person类的对象");
else
System.out.println("stu指向的不是Person类的对象");
}
}
输出结果如下:
per2指向的是Student类的对象
per2指向的是Person类的对象
per指向的不是Student类的对象
per指向的是Person类的对象
stu2指向的是Student类的对象
stu2指向的是Person类的对象
stu指向的是Student类的对象
stu指向的是Person类的对象
结果分析:
(1).per2 = stu;
stu2 = (Student) per2;
per2与stu指向了同一子类对象,所以可以进行向下转型。
(2).// stu2 = (Student) per;
由于per指向的是Person类的对象,所以向下转型会出错。
(3).从1,2,5,6,7,8行输出可以看出,使用instanceof时,不论a定义为父类的对象引用还是子类的对象引用,只要最终指向的是子类对象,instanceof判定它既是父类的实例也是子类的实例;即,可以看成子类实例包含了一个父类实例。
Java学习笔记15---instanceof与向下转型的更多相关文章
- Thinking In Java 学习笔记 1-5 章
第1章 对象导论 本章主要讲OOP的思想及一些OOP基本概念 1.抽象过程:万物都是对象,对象具有状态.行为和标识.对象拥有属性和方法,以及在内存中的唯一地址. 2.每个对象都有一个接口:通过接口给对 ...
- Java学习笔记15
do-while循环时while循环的变体语法如下:do{ // 循环体 语句(组);}while(循环继续条件); 如果循环中的语句至少需要执行一次,那么建议使用do-while循环. for循环 ...
- java学习笔记15(String 类,StringBuffer)
/* * String类的特点: * 所有的""都是String的对象 * 字符串一旦创建就是常量,不能改变 */ public class StringDemo { public ...
- Java 学习笔记(15)——反射
Java中的类文件最终会被编译为.class 文件,也就是Java字节码.这个字节码中会存储Java 类的相关信息.在JVM执行这些代码时首先根据 java 命令中指定的类名找到.class 文件然后 ...
- Java学习笔记15(面向对象八:匿名对象、内部类)
匿名对象: 是指创建对象的时候,只有创建对象的语句,却没有把对象地址值赋给某个变量 创建一个普通对象: Person p = new Person(); 创建一个匿名对象: new Person(); ...
- java学习笔记之基础篇
java选择语句之switch //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- 20145330第九周《Java学习笔记》
20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...
随机推荐
- B. Order Book(Codeforces Round #317 )
B. Order Book time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- 求前n个素数(C++)
输入一个输n,输出前n个素数. #include<iostream> #include <math.h> using namespace std; class Sushu { ...
- .NET Core RSA 签名和验签(密钥为 16 进制编码)
使用 OpenSSL 生成公私钥对,命令: $ openssl genrsa -out rsa_1024_priv.pem $ openssl pkcs8 -topk8 -inform PEM -in ...
- MD5加密--Java
MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.R ...
- 配置Meld为git的默认比较工具
1. 安装 meld sudo apt-get install meld 2. 创建 git_meld.sh 脚本 cd /bin vim git-meld.sh #!/bin/sh meld $2 ...
- VS2010灵活运用快捷操作功能(总结)
转载于:http://blog.csdn.net/trassion/article/details/7667814 1.快速using(这个的快捷键是ctrl+.) 2.快速回到之前编辑的代码页面现在 ...
- 浅谈Async/Await
概要 在很长一段时间里面,FE们不得不依靠回调来处理异步代码.使用回调的结果是,代码变得很纠结,不便于理解与维护,值得庆幸的是Promise带来了.then(),让代码变得井然有序,便于管理.于是我们 ...
- ASP.NET Core 系列视频完结,新项目实战课程发布。
今天把MVC的章节完成了,给大家从头到尾做了一个登录注册的示例,带前后端Model验证,算是完整的示例.同时借助于eShopOnContainers的示例也做了一个DBContextSeed的包装器来 ...
- java并发编程的艺术——第五章总结(Lock锁与队列同步器)
Lock锁 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程访问共享资源,如读写锁). 在Lock接口出现前,java使用synchr ...
- H5之前端操作文件
js是否能够操作文件? js在HTML5以前浏览器端是无法操作文件的,但HTML5中给a标签增加了一个download属性,只要有这个属性,点击这个链接时浏览器就不在打开链接指向的文件,而是改为下载( ...