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. 【NET CORE微服务一条龙应用】应用部署

    简介 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 本章主要介绍https://github.com/q315523275/FamilyBucket上微服务一条龙应用,在实际使用中的应用 ...

  2. Struts2之ValueStack、ActionContext

    今天在看Action获取Resquest.Response时,发现了一个词:值栈.于是今天一天都在看,了解了值栈不仅能知道Action怎么获取request.response等这些,还会了解OGNL语 ...

  3. MAC ACL、RACL和VACL

    拓扑结构: 配置IP地址.VLAN及路由: SW1(config)#int range f0/1 - 2SW1(config-if-range)#switchport mode accessSW1(c ...

  4. JS实现用特殊符号替换字符串的中间部分区域

    一.引入 相信很多人都遇到过敏感信息需要做部分隐藏功能,大多数都是用特殊符号去替换. 正好今天我又遇到这样的前端显示的需求,正好把相关JS记录下来,方便下次再用. 二.JS部分 /* 部分隐藏处理 * ...

  5. GridView控件的属性、事件

    GridView控件的属性 属性 描述 AllowPaging 指示该控件是否支持分页. AllowSorting 指示该控件是否支持排序. AutoGenerateColumns 指示是否自动地为数 ...

  6. CSS学习笔记07 盒子模型

    1.盒子模型 所谓盒子模型就是把HTML页面中的元素看作是一个矩形的盒子,也就是一个盛装内容的容器.每个矩形都由元素的内容.内边距(padding).边框(border)和外边距(margin)组成. ...

  7. webpack4 系列教程(三): 多页面解决方案--提取公共代码

    这节课讲解webpack4打包多页面应用过程中的提取公共代码部分.相比于webpack3,4.0版本用optimization.splitChunks配置替换了3.0版本的CommonsChunkPl ...

  8. Docker 容器备份例子

    # 在 node1 执行 nginx 程序,挂载本地的目录 docker pull nginx:stable-alpine mkdir /data/html echo "hello worl ...

  9. csharp: read system DSN configured get Driver Names on windows

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. 微信小程序request同步请求

    今天在搞微信小程序的时候顺手用了async,await死活不起作用,后来查了一下子,竟然不支持,那没办法就换了一种实现wx.request同步请求的方案 祭出promise来搞一搞,下面直接贴代码,简 ...