一、常用字面量默认的数据类型
Java是强类型语言,任何在程序中直接写出来的字面量都有确定的类型。
如:10 默认为int整型字面量
90.5 默认为double浮点型字面量
'' 默认为char字符型字面量
"" 字符串默认为String类的对象
二、给long、float型变量赋值时的字面量
定义long类型变量并赋值时需给字面量加上L(l) ,也可以不加。
如:long a = 10L(l); 或 long a = 10;
定义float类型变量并赋值时必须给字面量加上F(f) 。
如:float a = 10.0F(f);
1. 定义long型变量并赋值时,右侧字面量加L(l)和不加L(l)的区别
加了L(l) long a = 10L(l); 10才为long型字面量
未加L(l) long a = 10; 10默认为int型字面量,但可能编译不通过
具体分析:
1)不加L(l) —— 默认为int型字面量,取值在int型范围内
a. 若未超出int型的取值范围,则编译通过,实际上隐含了 int -> long 的类型转换(小类型到大类型的自动提升)
b. 若超出了int型的取值范围,则编译不通过
2)加L(l) —— 为long型字面量,取值在long型范围内
2. 定义float型变量并赋值时,右侧字面量必须加F(f),否则编译不通过
加了F(f) float a = 10.0F(f); 10.0才为float型字面量
未加F(f) float a = 10; 10默认为double型字面量,编译不通过
三、数据类型转换中的几个要点
1. 对于基本数据类型之间的转换,可根据所占字节数来判断是相对大类型/小类型
如:8字节的double型较4字节的int型大,4字节的int型较2字节的char大
2. 大类型和小类型之间的相互转换【针对基本数据类型】
1)大类型转换为小类型:一般都需要手动进行强制类型转换
但可能发生溢出 / 丢失精度。
如:long -> int 可能发生数据过大导致的溢出(int型放不下)
double -> int 可能发生小数点后多位精度丢失
特例:
对基本数据类型使用增量运算符 ( += *= /= %= ) 时,若涉及大类型转换为小类型,会自动进行强制类型转换,无需手动强转。
2)小类型转换为大类型:数据类型自动提升,无需强转
但若小类型的数据已经溢出,则再存储到大类型中时,即使装得下,也显示为溢出。
3. int与byte之间的类型转换
1)byte -> int :小类型转换为大类型,数据类型自动提升
2)int型变量给byte型变量赋值:大类型转换为小类型,需进行强制类型转换
3)int型字面量给byte型赋值: 不一定要进行强制类型转换
分两种情况:
a. 原int值未超byte取值范围 ==> 无需强转
b. 原int值已超byte取值范围 ==> 需强转
注意:实际上在计算机底层,byte型仍以4字节的int型存储
小于4字节的数值型和字符型数据 (byte、short、char),计算机底层在存储时会转换为4字节
CPU在读写内存数据时,都是以4字节为单位的。
4. 数学运算中的类型转换
1)小类型和大类型进行数学运算时,小类型会自动提升为大类型后再执行运算
2)若执行数学运算的两个数据类型同为byte型,但由于byte型实际上是以int型存储的,故运算结果也为int型而非byte型,需进行强制类型转换
5. final关键字不允许进行数据类型转换
被final关键字修饰的变量即成为常量,不仅值不能改变,数据类型也不可以改变
则计算机底层也不会将小于4字节的数据转为4字节类型存储
下题只有选项A正确,其他都编译不通过。
6. int与char之间的类型转换
int型和char型看似毫不相干,但由于计算机内部都是以0/1机器码存储数据的,故不论int还是char型数据,都会根据Unicode格式转为数字0/1,故int和char也可以进行类型转换。
二者均为基本数据类型,转换方式同2。int (4字节) 为相对大类型,char (2字节) 为相对小类型。
补充知识:
Java默认的字符集是Unicode统一编码,支持地球上的所有语言。
byte字节类型:占1个字节,[-128 ~127](一般用于文件和网络传输中)
short短整型:占2个字节(基本用不到)
int整型:占4个字节,最大值约为21亿
long长整型:占8个字节
char字符型:无论中/英文,均占2个字节
float单精度浮点型:占4个字节,小数点后6位是有效数字
double双精度浮点型:占8个字节,小数点后12位是有效数字
boolean布尔型:占用的字节数不定,与JVM的版本有关,true和false与0和1无关,boolean类型不能与其他基本数据类型进行转换
7. int型与String之间的类型转换
不再为两个基本数据类型之间的转换,不按照2的方式进行转换。
1)int -> String 的两种方式:
a. 调用String类的静态方法valueOf(int i)
b. 使用“ + ”连接符进行拼接
" + "拼接操作:
1)从出现字符串的位置开始向后连接所有字符串,后方的所有任意数据类型都会被转换为字符串。
2)在字符串" "出现之前,若有算术运算则照常执行算术运算。
3)若希望在字符串" "出现之后仍然执行算术运算,可使用 () 括号。
2) String -> int:调用int包装类Integer的静态方法parseInt(String s),但仅限于数字字符串
8. boolean不能与其他基本数据类型进行转换,但可以和引用数据类型String转换
1)boolean -> String的两种方式:
a. 调用String类的静态方法valueOf(boolean b)
b. 使用“ + ”连接符进行拼接
2)String -> Boolean:调用boolean包装类Boolean的静态方法valueOf(String s)