Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • Java入门基础

    • 计算机常识

    • Java语言概述

    • 基本语法

    • 数组

    • 面向对象

      • 面向对象
      • 类和对象
      • 类的成员-属性
      • 类的成员-方法
      • 类的成员-构造器
      • 面向对象特性-封装
      • this关键字
      • package关键字
      • import关键字
      • 面向对象特征-继承
      • 方法的重写
      • 访问权限修饰符
      • super关键字
      • 子类对象实例化的全过程
      • 面向对象特征-多态
      • 强制类型转换
        • 前言
        • Casting对象类型转换
          • 语法格式
        • instanceof操作符
          • API
          • 作用
        • 最后
      • Object类
      • 包装类
      • static关键字
      • 单例设计模式
      • main方法
      • 类的成员-代码块
      • final关键字
      • 抽象类与抽象方法
      • 接口
      • 类的成员-内部类
    • 异常处理

  • Java核心基础

  • 设计模式

  • Web开发

  • SpringBoot

  • 微服务

  • Elasticsearch

  • 运维

  • 后端
  • Java入门基础
  • 面向对象
SaulJWu
2020-12-11

强制类型转换

# 前言

在上一个案例中,我们已经知道这是对象的多态,但是现在问一个问题,Man类中的字段isSmoking,还存在吗?还在堆内存中吗?要怎么才能调用?

Person p = new Man();
1

存在的,还在堆内存中,只是因为声明引用时,声明的是父类,所以不能调用,实际上实例化对象时,就已经创建了这些字段。

如果需要访问/调用,

那么需要Casting对象类型转换,也叫强制类型转换/向下转型。

在多态实例化中,子类新增加的属性和方法,父类虽然不能访问,但是它们还在堆内存中,只需要将引用转换为堆内存中跟对象一致的数据类型就可以访问了。

# Casting对象类型转换

# 语法格式

数据类型 变量名1 = (数据类型)变量名2;
1

比如解决前言中的案例:

Person p = new Man();
Man m = (Man)p;
1
2

对于类型转换,可以分为两类:

  • 基本数据类型的Casting:
    • 自动类型转换:小的数据类型可以自动转换成大的数据类型
      • 如longg=20;doubled=12.0f
    • 强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型
      • 如floatf=(float)12.0;inta=(int)1200L
  • 对Java对象的强制类型转换称为造型
    • 从子类到父类的类型转换可以自动进行
    • 从父类到子类的类型转换必须通过造型(强制类型转换)实现
    • 无继承关系的引用类型间的转换是非法的
    • 在造型前可以使用instanceof操作符测试一个对象的类型

image-20201211193226810

# instanceof操作符

使用强制类型转换是有风险的,比如在基本数据类型中,有可能会丢失精度。

而且还有可能报错:java.lang.ClassCastException

Person p2 = new Man();
Woman w = (Woman) p2;
1
2

那么为了解决程序运行正常,不出现异常,我们需要instanceof操作符。

# API

x instanceof A:检验x是否为类A的对象,返回值为boolean型

# 作用

那么上面的代码应该这样写:

Person p2 = new Man();
if(p2 instanceof Woman){
	Woman w = (Woman) p2;
}
1
2
3
4

使用情景:为了避免向下转型时出现异常,我们在向下转型之前,先进行instanceof判断,一旦返回true,才向下转型,返回false,就不向下转型。

如果 A instanceof B == true,A instanceof C == true,那么B和C是继承关系。

Person p2 = new Man();
System.out.println(p2 instanceof Man);
System.out.println(p2 instanceof Person);
1
2
3
true
true
1
2

# 最后

实际开发中,我们大多数用的是向上类型转换,很少用向下类型转换,但是你也必须会,因为万一哪一天用到了呢。

帮我改善此页面 (opens new window)
#Casting#instanceof#强制类型转换
上次更新: 2020/12/18, 12:50:58
面向对象特征-多态
Object类

← 面向对象特征-多态 Object类→

最近更新
01
zabbix学习笔记二
02-28
02
zabbix学习笔记一
02-10
03
Linux访问不了github
12-08
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式