1. 概述
Java是一种强类型语言,这意味着它利用了类型的概念。
在Java中有两种不同的类型:
- 基本类型
- 类类型
在本文中,我们将重点关注基本类型的转换。
2. 基本类型
我们必须要知道的第一件事是什么样的值,可以与原始类型一起使用。
Java中有八种基本类型:
- byte 8位,有符号。
- short 16位,有符号。
- char 16位且无符号,可以表示Unicode字符
- int 32位,有符号。
- long 64位,有符号。
- float 32位,有符号。
- double 64位,有符号。
- boolean 不是数字,只有
true或false
3. 扩大基本类型
当我们从比目标类型更小的基本类型哪里转换时,我们不必使用任何特殊符号:
int myInt = 127;
long myLong = myInt;
在扩大转换中,因为是较小的基本类型放在较大的容器上,意味着值左侧的所有额外空间都用零填充。这也可以用于从整数到浮点数:
float myFloat = myLong;
double myDouble = myLong;
因此转换到更大的基本类型时,不会丢失任何信息。
4 缩小基本类型
有时我们需要转换为一个大于变量声明中使用的基本类型的值。这可能导致信息丢失,因为在转换时必须丢弃一些字节。
在这种情况下,我们必须明确表达我们知道会丢弃一些东西,并且我们同意这一点,通过使用强制类型转换:
int myInt = (int) myDouble;
byte myByte = (byte) myInt;
5. 扩大和缩小基本类型
当我们从一个byte转换为一个char时,会发生什么呢?
- 先将byte转换为int
- 然后,将int转换为char
我们来看一个例子。
byte myLargeValueByte = (byte) 130; //0b10000010 -126
130的二进制表示对于-126是相同的,不同之处在于信号位的解释。
现在让我们从byte转换为char:
char myLargeValueChar = (char) myLargeValueByte;
//0b11111111 10000010 unsigned value
int myLargeValueInt = myLargeValueChar; //0b11111111 10000010 65410
myLargeValueChar表示一个Unicode字符,但是转换为int之后变成了一个很大的数。仔细观察,你会返现二进制中的低八位和*-126*是一样的。
如果我们将int再次转换为byte,我们将得到:
byte myOtherByte = (byte) myLargeValueInt; //0b10000010 -126
如果直接使用130赋值给char,则值会将不同
char myLargeValueChar2 = 130; // 130不是byte了。
//0b 00000000 10000010 unsigned value
int myLargeValueInt2 = myLargeValueChar2; //0b00000000 10000010 130
byte myOtherByte2 = (byte) myLargeValueInt2; //0b10000010 -126
尽管和byte表示相同,但char表示了两个不同的字符。
6.自动装箱/拆箱
在Java中,我们为每种基本类型都有一个包装类。
从Java 1.5开始,基本类型和对应的包装类型间可以自动的转换:
int myInt = (int) myDouble;
byte myByte = (byte) myInt;
7. 字符串转换
所有原始类型都可以通过它们的包装类转换为String,因为包装类覆盖了*toString()*方法:
String myString = myIntegerReference.toString();
如果我们需要从字符串返回基本类型,我们需要使用由相应的包装类类定义的parse方法:
byte myNewByte = Byte.parseByte(myString);
short myNewShort = Short.parseShort(myString);
int myNewInt = Integer.parseInt(myString);
long myNewLong = Long.parseLong(myString);
float myNewFloat = Float.parseFloat(myString);
double myNewDouble = Double.parseDouble(myString);
boolean myNewBoolean = Boolean.parseBoolean(myString);
唯一的例外是Character,因为String是由char构成的。我们在String类中,可以charAt来获取字符串中的char
char myNewChar = myString.charAt(0);
8. 数字运算
要执行二元操作,两个操作数必须在大小方面兼容。
有一个简单的规则:
- 如果其中一个操作数是double,则另一个操作数被提升为double
- 否则,如果其中一个操作数是浮点数,则另一个操作数被提升为浮点数
- 否则,如果其中一个操作数是long,则另一个操作数被提升为long
- 否则,两者都被认为是int
看一个例子
byte op1 = 4;
byte op2 = 5;
byte myResultingByte = (byte) op1 + op2;
两个操作数都被提升为int,计算的结果再次向下转换为byte。
9. 结论
类型之间的转换是日常编程活动中非常常见的任务。
了解上面的这些规则可能会在查找某个代码编译原因时,节省大量时间。
最后,往常一样,代码可以在Github上找到。