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 ...
随机推荐
- OpenCV 读取视频 多种方式
OpenCV中常见的视频方式是while循环读取,可是,当遇到嵌套循环呢 1.常见的while循环 ,没有嵌套循环 cv::VideoCapture capture("d:/test/dem ...
- Tabhost中Activity绑定Service
在android中,一个Activity绑定一个Service组件我们一般用Context().bindService方法就能够.可是假设这个 Activity属于一个Tabhost的话就不行了,在网 ...
- JAVA入门[12]-JavaBean
一.什么是JavaBean JavaBean是特殊的Java类,使用Java语言书写,并且遵守规范: 提供一个默认的无参构造函数. 需要被序列化并且实现了Serializable接口. 可能有一系列可 ...
- mysql默认安装目录说明
MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件.配置文件和命令文件分别在不同的目录,了解这些目录非常重要,尤其对于Linux的初学者,因为 Linux本身的目录结构就比 ...
- 自学Zabbix2.1-安装需求
zabbix的安装需求通常就是硬件配置.软件需求,或者说我安装zabbix需要什么软件,服务器需要什么样的配置,监控100台服务器需要怎样的一台服务器,或者我有一台8核16G的服务器,我能监控多少台服 ...
- jsp的标签库和自定义标签
1.jstl标签库 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...
- 【开源】接口管理平台eoLinker AMS 开源版3.1.5同步线上版!免费增加大量功能!
概要:eoLinker是一个免费开源的针对开发人员需求而设计的接口管理工具,通过简单的操作来帮助开发者进行接口文档管理.接口自动化测试.团队协作.数据获取.安全防御监控等功能,降低企业的接口管理成本, ...
- Android项目实战(三十五):多渠道打包
多渠道打包: 可以理解为:同时发布多个渠道的apk.分别上架不同的应用商店.这些apk带有各自渠道的标签,用于统计分析各个商店的下载次数等数据. 实现步骤 一.添加友盟渠道标签 添加位置:app目录下 ...
- if;脚本中退出语句:exit 数字,用$?查时为exit设置的数字,此数字为程序执行完后的返回数据,可以通过此方法自动设定
if [ 条件 ];then 代码 fi if [ 条件 ] then 代码 fi [root@localhost ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda5 % ...
- 多表连接时USING和ON的区别,USING会去掉重复列,ON显示重复列。