java的引用类型转换分为两种:

  1. 向上类型转换,是小类型到大类型的转换
  2. 向下类型转换,是大类型到小类型的转换

现存在一个Animal动物类,猫子类和狗子类继承于Animal父类;

 1 public class Animal {
2 private String name;
3
4 public String getName() {
5 return name;
6 }
7
8 public void setName(String name) {
9 this.name = name;
10 }
11
12 public void eat() {
13
14 }
15 }
16
17 public class Cat extends Animal {
18 public void eatFish() {
19 System.out.println("猫吃鱼");
20 }
21 }
22
23 public class Dog extends Animal {
24 public void eatBone() {
25 System.out.println("狗吃骨头");
26 }
27 }

  实例化一个cat对象,如下:

 1 Cat cat1 = new Cat();   //使用子类引用实例化子类对象
2
3 Animal cat2 = cat1;
4 //此时为向上引用转换,小类型转换为大类型,并没有风险
5
6 //Cat cat3 = cat2; //报错
7 //由于cat2已经是Animal类的引用,所以此时为向下引用转换,即大类型转换为小类型,有数据溢出的风险
8 //虽然有风险,但也可以强制转换
9 Cat cat3 = (Cat)cat2; //强制转换成功
10
11 //Dog dog1 = cat2; //因为子类不同所以不能这样引用
12 //Dog dog1 = (Dog)cat2; //即使强制转换也不行

  虽然向下引用转换会存在风险,但是可以利用java的instanceof关键字去解决这个问题。instanceof运算符用法:判断是一个实例对象是否属于一个类,是返回true,否则返回false。这样我们可以优化上面的代码避免强制转换类型时出现的问题:

 1 /**
2 * instanceof运算符用法
3 * 运算符是双目运算符,左面的操作元是一个对象,右面是一个类.当
4 * 左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false
5 *
6 * 说明:(1)一个类的实例包括本身的实例,以及所有直接或间接子类的实例
7 * (2)instanceof左边操作元显式声明的类型与右边操作元必须是同种类或右边是左边父类的继承关系,
8 * (3)不同的继承关系下,编译出错
9 */
10 if(cat2 instanceof Dog) {
11 Dog dog = (Dog)cat2;
12 }else {
13 System.out.println("并不能转换");
14 }

  但是当子类实例对象统一放进父类引用对象数组时,若要使用子类中的方法,必须先向下转换类型为子类引用,不然编译器会报错

 1 Animal[] animals = {
2 new Cat(),
3 new Dog()
4 };
5
6
7 //animals[1].eatFish(); //报错
8 if(animals[1] instanceof Cat) {
9 Cat cat = (Cat)animals[1];
10 }

Java引用类型转换的更多相关文章

  1. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  2. JAVA强制类型转换(转载+自己的感想) - stemon

    JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00  博客园-Java原文  http://www.cnblogs.com/stemon/p/33 ...

  3. Day06_28_Instanceof关键字 和 引用类型转换

    Instanceof关键字 和 引用类型转换 Instanceof 关键字 - instanceof 是 Java 的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean ...

  4. Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference

    Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...

  5. 4种Java引用浅解

    近期研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型 ...

  6. Java引用类型变量

    Java引用类型变量 1.编译时类型:由声明该变量时使用的类型决定 2.执行时类型:由实际赋给该变量的对象决定    类型不一致的假设编译时类型和执行,可能会出现多态性 版权声明:本文博主原创文章.博 ...

  7. Java 基础类型转换byte数组, byte数组转换基础类型

    Java 基础类型转换byte数组, byte数组转换基础类型 Java类型转换 java类对象转化为byte数组

  8. Java数据类型转换浅析

    Java数据类型转换分为两种:自动类型转换和强制类型转换. 数据类型转换的关键是数据类型相应的表数范围大小 1.自动类型转换: 概念:小范围数据类型会自动转化成大范围数据类型 实例: int a=10 ...

  9. 关于Java String 类型转换时null的问题(转)

    关于Java String 类型转换时null的问题 开发中经常遇到从集合类List.Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.NullPoi ...

随机推荐

  1. MongoDB 常用的几大GUI工具

    MongoDB 常用的几大GUI工具 MongoDBCompass (官方的连接工具),免费的,界面简洁,不支持 sql 查询,支持性能监控.支持在三大平台 Windows .Mac .Linux 上 ...

  2. Kafka实战解惑

    目录 一. kafka简介二. Kafka架构方案三. Kafka安装四. Kafka Client API 4.1 Producers API 4.2 Consumers API 4.3 消息高可靠 ...

  3. docker使用技巧小记

    1.在使用docker的时候有很多人习惯使用官方镜像.有的人喜欢自己制作镜像,有的时候都是使用默认的配置启动的服务,或者自己在制作镜像的时候直接将配置文件打包到镜像里面了.有的时候会碰到要修改配置文件 ...

  4. 实验吧 貌似有点难 伪造ip

    解题链接: http://ctf5.shiyanbar.com/phpaudit/ 解答: 点击View the source code —>代码显示IP为1.1.1.1即可得到KEY—> ...

  5. Maven教程2(Eclipse配置及maven项目)

    Maven教程1(介绍安装和配置) Eclipse中配置maven 1.Eclipse中默认集成的有Maven 可以使用默认的,本地仓库在当前用户下的.m2文件夹下. 2.配置我们自己安装的maven ...

  6. 代码创建 WPF 旋转、翻转动画(汇总)

    先建立一个button <Button Width="80" Height="60" Content="旋转" Name=" ...

  7. 导入本地的oracle数据库文件

    1. 创建表空间 create tablespace charge_zang datafile 'F:\app\zang\oradata\orcl\charge_zang.dbf' size 50M ...

  8. 【Mysql】MySQL event 计划任务

    一.查看event是否开启 show variables like '%sche%'; set global event_scheduler =1; 二. -- 设置时区并设置计划事件调度器开启,也可 ...

  9. Java使用foreach语句对数组成员遍历输出

    /** * 本程序使用foreach语句对数组成员进行遍历输出 * @author Lei * @version 2018-7-23 */ public class ForeachDemo { pub ...

  10. vue项目sql图片动态路径引用问题

    最近遇到一个vue动态图片路径的引用问题?明明路径是正确的但是却渲染不出图片!先看我慢慢说来!! 1.当我们把图片的路径放置在data(){return:{}}中的数组中的时候,然后通过v-for循环 ...