简介
Java语言支持的类型分为两类:
- 基本类型;
- 引用类型
在Java程序中,不同的基本类型的值经常需要进行相互转换,有两种类型转换方式:
- 自动类型转换
- 强制类型转换
int是最常用的整数类型,因此在通常情况下,直接给出一个整数值默认就是int类型。除此之外,有如下两种情形必须指出:
- 如果直接将一个较小的整数值(在byte或short类型的表数范围内)赋给一个byte或short变量,系统会自动把这个整数值当成byte或者short类型来处理;
- 如果使用一个巨大的整数值(超出了int类型的表数范围)时,Java不会自动把这个整数值当成long类型来处理。如果希望系统把一个整数值当成long类型来处理,应在这个整数值后增加l或者L作为后缀。推荐使用L,不会搞混;
char代表字符串,实际上字符型也是一种整数类型,相当于无符号整数类型;
Java语言的浮点类型默认是double类型。例如:5.12代表一个double类型的值,占64位的内存空间;5.12f或者5.12F才表示一个float类型的值,占32位的内存空间;
Java还提供了三个特殊的浮点数值:正无穷大、负无穷大和非数,用于表示溢出和出错;所有的正无穷大数值都是相等的,所有的负无穷大数值都是相等的;而NaN不与任何数值相等,甚至和NaN都不相等;
自动类型转换
Java所有的数值型变量可以相互转换,如果系统支持把某种基本类型的值直接赋给另一种基本类型的变量,则这种方式被称为自动类型转换。当把一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,系统将可以进行自动类型转换;
表数范围小的可以向表数范围大的进行自动类型转换,就如同有两瓶水,当把小瓶里的水倒入大瓶中时不会有任何问题;
AutoConversion.java
public class AutoConversion
{
public static void main(String[] args)
{
int a = 6;
//int可以自动转换为float类型
float f = a;
//下面将输出6.0
System.out.println(f);
//定义一个byte类型的整数变量
byte b = 9;
// 下面代码将出错,byte型不能自动类型转换为char型
//char c = b;
// 下面是byte型变量可以自动类型转换为double型
double d = b;
//下面将输出9.0
System.out.println(d);
}
}
强制类型转换
如果希望把图3.10中箭头右边的类型转换为左边的类型,则必须进行强制类型转换;
当进行强制类型转换时,类似于把大瓶子里的水倒入一个小瓶子,如果大瓶子里的水不多还好,但如果大瓶子里的水很多,将会引起溢出,从而造成数据丢失。这种转换也被称为“缩小转换”、“窄化转换”;
NarrowConversion.java
public class NarrowConversion
{
public static void main(String[] args)
{
int iValue = 233;
//强制把一个int类型的值转换为byte类型的值
byte bValue = (byte)iValue;
//将输出-23
System.out.println(bValue);
double dValue = 3.98;
//强制把一个double类型的值转换为int
int toI = (int)dValue;
// 将输出3
System.out.println(toI);
}
}
把浮点数强制类型转换为整数时,Java将直接截断浮点数的小数部分;
当试图强制把表数范围大的类型转换为表数范围小的类型时,必须格外小心,因为非常容易引起信息丢失;
表达式类型的自动提升
当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升:
- 所有的byte类型、short类型和char类型将被提升到int类型;
- 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型;
AutoPromote.java
public class AutoPromote
{
public static void main(String[] args)
{
//定义一个short类型变量
short sValue = 5;
//下面代码将出错:表达式中的sValue将自动提升到int类型,
//则右边的表达式类型为int,将一个int类型赋给short类型的变量将发生错误。
//sValue = sValue - 2;
byte b = 40;
char c = 'a';
int i = 23;
double d = .314;
//右边表达式中在最高等级操作数为d(double型)
//则右边表达式的类型为double型,故赋给一个double型变量
double result = b + c + i * d;
//将输出144.222
System.out.println(result);
int val = 3;
//右边表达式中2个操作数都是int,故右边表达式的类型为int
//因此,虽然23/3不能除尽,依然得到一个int整数
int intResult = 23 / val;
//将输出7
System.out.println(intResult);
//输出字符串Hello!a7
System.out.println("Hello!" + 'a' + 7);
/**
* 先进行'a'+7加法运算,其中'a'自动提升为int类型,变成a对应的ASCII值:97,从97+7得到104
* 然后执行104+Hello运算
*/
//输出字符串104Hello!
System.out.println('a' + 7 + "Hello!");
}
}
表达式的类型将严格保持和表达式中最高等级操作数相同的类型;
书籍:疯狂Java讲义
学习所做的笔记,特此记录下来