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 ...
随机推荐
- Python 日期和时间操作
Python提供了一个time 和calendar模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都是以自从1970年1月1日午夜(历元)经过了多长时间来表示. Pytho ...
- Python字符串和日期相互转换的方法
import time,datetime # 日期转换成字符串 print time.strftime("%Y-%m-%d %X", time.localtime()) #字符串转 ...
- 【c语言】实现一个函数,求字符串的长度,不同意创建第三方变量
// 实现一个函数,求字符串的长度.不同意创建第三方变量. #include <stdio.h> #include <assert.h> int my_strlen_no(ch ...
- 利用linux shell自己主动顶贴
在论坛上面发帖问个什么东西的话,一旦不顶.帖子就秒沉了,可是又实在不想每时每刻都去顶,怎么办?以下展示了怎样利用shell 的crontab实现自己主动顶贴. 闲话不多说了,以豆瓣为例-– 1: 用c ...
- hibernate学习笔记之中的一个(JDBC回想-ORM规范)
JDBC回想-ORM规范 JDBC操作步骤 注冊数据库驱动 Class.forName("JDBCDriverClass") 数据库 驱动程序类 来源 Access sun.jdb ...
- dma_alloc_coherent (建立一致性 DMA 映射函数)
1.函数申明 /** * dma_alloc_coherent - allocate consistent memory for DMA * @dev: valid struct device poi ...
- python3.5新增函数isclose的使用
前言:python3.5的math模块新增一个isclose函数用来判断两个浮点数的值是否接近或相等,这是由于浮点数的计算总是存在一定的误差.下面谈一下用法: import math print(ma ...
- Spring依赖注入原理
接触过spring 的同学应该都知道依赖注入,依赖注入又称控制反转,其内涵就是,将创建某个bean的控制权力,由原来需要引用这个bean的bean转移(反转)到外部的spring IOC容器,由IOC ...
- 3D Game Programming withDX11 学习笔记(一) 数学知识总结
在图形学中,数学是不可或缺的一部分,所以本书最开始的部分就是数学知识的复习.在图形学中,最常用的是矢量和矩阵,所以我根据前面三个章节的数学知识,总结一下数学知识. 一.矢量 数学中的矢量,拥有方向和长 ...
- 【NOIP模拟】【USACO】 Bovine Genomics
Description 给定两个字符串集合A,B,均包含N个字符串,长度均为M,求一个最短的区间[l,r],使得不存在字符串\(a\in A,b\in B,\)且\(a[l,r]=b[l,r]\) , ...