感冒咳嗽停更了几天,今天恢复更新了。

先来看下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与向下转型的更多相关文章

  1. Thinking In Java 学习笔记 1-5 章

    第1章 对象导论 本章主要讲OOP的思想及一些OOP基本概念 1.抽象过程:万物都是对象,对象具有状态.行为和标识.对象拥有属性和方法,以及在内存中的唯一地址. 2.每个对象都有一个接口:通过接口给对 ...

  2. Java学习笔记15

    do-while循环时while循环的变体语法如下:do{  // 循环体 语句(组);}while(循环继续条件); 如果循环中的语句至少需要执行一次,那么建议使用do-while循环. for循环 ...

  3. java学习笔记15(String 类,StringBuffer)

    /* * String类的特点: * 所有的""都是String的对象 * 字符串一旦创建就是常量,不能改变 */ public class StringDemo { public ...

  4. Java 学习笔记(15)——反射

    Java中的类文件最终会被编译为.class 文件,也就是Java字节码.这个字节码中会存储Java 类的相关信息.在JVM执行这些代码时首先根据 java 命令中指定的类名找到.class 文件然后 ...

  5. Java学习笔记15(面向对象八:匿名对象、内部类)

    匿名对象: 是指创建对象的时候,只有创建对象的语句,却没有把对象地址值赋给某个变量 创建一个普通对象: Person p = new Person(); 创建一个匿名对象: new Person(); ...

  6. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

  7. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  8. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  9. 20145330第九周《Java学习笔记》

    20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...

随机推荐

  1. Python 日期和时间操作

    Python提供了一个time 和calendar模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都是以自从1970年1月1日午夜(历元)经过了多长时间来表示. Pytho ...

  2. Python字符串和日期相互转换的方法

    import time,datetime # 日期转换成字符串 print time.strftime("%Y-%m-%d %X", time.localtime()) #字符串转 ...

  3. 【c语言】实现一个函数,求字符串的长度,不同意创建第三方变量

    // 实现一个函数,求字符串的长度.不同意创建第三方变量. #include <stdio.h> #include <assert.h> int my_strlen_no(ch ...

  4. 利用linux shell自己主动顶贴

    在论坛上面发帖问个什么东西的话,一旦不顶.帖子就秒沉了,可是又实在不想每时每刻都去顶,怎么办?以下展示了怎样利用shell 的crontab实现自己主动顶贴. 闲话不多说了,以豆瓣为例-– 1: 用c ...

  5. hibernate学习笔记之中的一个(JDBC回想-ORM规范)

    JDBC回想-ORM规范 JDBC操作步骤 注冊数据库驱动 Class.forName("JDBCDriverClass") 数据库 驱动程序类 来源 Access sun.jdb ...

  6. dma_alloc_coherent (建立一致性 DMA 映射函数)

    1.函数申明 /** * dma_alloc_coherent - allocate consistent memory for DMA * @dev: valid struct device poi ...

  7. python3.5新增函数isclose的使用

    前言:python3.5的math模块新增一个isclose函数用来判断两个浮点数的值是否接近或相等,这是由于浮点数的计算总是存在一定的误差.下面谈一下用法: import math print(ma ...

  8. Spring依赖注入原理

    接触过spring 的同学应该都知道依赖注入,依赖注入又称控制反转,其内涵就是,将创建某个bean的控制权力,由原来需要引用这个bean的bean转移(反转)到外部的spring IOC容器,由IOC ...

  9. 3D Game Programming withDX11 学习笔记(一) 数学知识总结

    在图形学中,数学是不可或缺的一部分,所以本书最开始的部分就是数学知识的复习.在图形学中,最常用的是矢量和矩阵,所以我根据前面三个章节的数学知识,总结一下数学知识. 一.矢量 数学中的矢量,拥有方向和长 ...

  10. 【NOIP模拟】【USACO】 Bovine Genomics

    Description 给定两个字符串集合A,B,均包含N个字符串,长度均为M,求一个最短的区间[l,r],使得不存在字符串\(a\in A,b\in B,\)且\(a[l,r]=b[l,r]\) , ...