Java笔记整理(五)数据类型转换和直接量
笔记都写在印象笔记了,一点一点整理到博客上。。。。
学习的教材为《疯狂Java讲义》精粹(第二版) 讲的比较细致,推荐阅读。(非广告)
在日常coding中,不同数据类型的值经常需要进行相互转换。类型转换分为两种:自动类型转换 和强制类型转换
一、基本类型的类型转换(数值类型和boolean类型之间不能进行类型转换)
基本数据类型转换关系图:
Java所有的数值型变量可以相互转换,当把一个所属类型表数范围小的数值或变量直接赋给另一个范围大的变量是,系统可以进行自动类型转换,反之就需要强制转换。——就好像有两瓶水,小瓶的水倒入大瓶中没有问题,反过来就可能出现问题,比如溢出,可以类比到程序中的内存溢出。
(1)先来看自动类型转换:
(2)String类型与基本数据类型的转换
在通常情况下,字符串类型不能直接转换为基本数据类型,但当基本数据类型与字符串进行连接运算时(使用"+"运算符来拼接),基本类型的值将自动转换为字符串类型
比如这样:
但在Java为8中基本类型都提供了对应的包装类:
boolean——Boolean,int——Integer,byte——Byte,short——Short,long——Long,
char——Character,float——Float,double——Double
除了Character类,其他7个包装类都提供了一个parseXxx(String str)的静态方法用于将字符串转换为对应的基本类型(Xxx代表对应的基本数据类型,parseInt)
示例:
(3)强制类型转换
如果需要把类型转换图中箭头右边的类型转换成左边的类型,则必须进行强制类型转换,转换的格式是:(targetType)value
但如果需要强制转换的值比目标类型值的表数范围大就可能产生错误的结果:
就好比大瓶的水倒进小瓶里,如果水少的话没什么问题,如果水量超过小瓶的容量,就会溢出,也就是发生数据丢失。
示例:
(4)表达式类型的自动提升
当一个算数表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。
Java定义了自动提升规则:
——> 所有的byte、short、char类型将被提升到int;
——> 整个算术表达式的数据类型将自动提升到与表达式中最高等级操作数同样的类型,等级排列见前面的类型转换图。
示例:
二、直接量
直接量通俗来说就是可以在声明变量时可以直接赋予的值。
能指定直接量的通常只有三种类型:基本类型、字符串类型、null类型
Java支持以下8种类型的直接量:
1、int类型:在声明变量直接给出的整型数值,可分为二(0B/0b)、八(0)、十、十六进制(0x/0X) (123、012、0b11010101);
2、long类型:在整型数值后添加 l/L后就变成了long类型的直接量(3L、0X12L);
3、float类型:在一个浮点数后添加f/F就变成了float类型的直接量(3.45F、3.14E5);
4、double类型:直接给出一个标准小数或科学计数法形式的浮点数(5.34、3.14E5);
5、char类型:三种形式->
(1)用单引号括起来的字符('a');
(2)转义字符('\n');
(3)Unicode值表示的字符('\u0062');
6、boolean类型:true和false,只能赋给boolean类型的变量;
7、null类型:null
(一种特殊类型,只有null这个值,可以直接赋给任何引用类型的变量,
用来表示这个引用类型变量中保存的地址为空,表示还未指向任何有效对象);
8、String类型:用双引号括起来的字符序列(“字符串”),String类型的直接量不能赋给其他类型的变量。
三、引用变量的类型转换
在了解引用变量的类型转换之前,先来了解引用变量的两种类型:
1、编译时类型:由声明改变量时使用的类型所决定
2、运行时类型:由实际赋给改变量的对象所决定
引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,会出现编译错误。
如果编译时类型和运行时类型不一致,就可能出现所谓的多态(Polymorphism),比如方法调用
//Shape是父类,Circle是子类
Circle circle = new Circle();//本类引用指向本类对象,编译时类型是Circle,运行时类型也是Circle
//Shape和Circle存在继承关系,所以可以自动向上转型
Shape shape = new Circle();//父类引用指向子类对象,编译时类型是Shape,运行时类型是Circle
- Java允许把一个子类对象直接赋值给一个父类引用变量,无须类型转换,即自动转换,被称为向上转型,由系统自动完成。
- 这种转型只是表明这个引用变量的编译时类型是父类,运行时类型是子类。
- 实际执行这个对象的方法时,依然表现出子类对象的行为方式
但当把一个父类对象赋给子类引用变量时(也称为向下转型),就需要进行强制类型转换,就可能在运行时产生ClassCastException异常
(使用instanceof运算符可以让强制类型转换更安全)
这个知识点涉及到面向对象中的多态,在之后的笔记中再细究。
这是我的学习笔记,请大家多多指教。
---学习记录----