Java基本类型的转换

445 阅读4分钟
原文链接: www.ripjava.com

1. 概述

Java是一种强类型语言,这意味着它利用了类型的概念。

在Java中有两种不同的类型:

  • 基本类型
  • 类类型

在本文中,我们将重点关注基本类型的转换。

2. 基本类型

我们必须要知道的第一件事是什么样的值,可以与原始类型一起使用。

Java中有八种基本类型:

  • byte 8位,有符号。
  • short 16位,有符号。
  • char 16位且无符号,可以表示Unicode字符
  • int 32位,有符号。
  • long 64位,有符号。
  • float 32位,有符号。
  • double 64位,有符号。
  • boolean 不是数字,只有truefalse

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. 数字运算

要执行二元操作,两个操作数必须在大小方面兼容。

有一个简单的规则:

  1. 如果其中一个操作数是double,则另一个操作数被提升为double
  2. 否则,如果其中一个操作数是浮点数,则另一个操作数被提升为浮点数
  3. 否则,如果其中一个操作数是long,则另一个操作数被提升为long
  4. 否则,两者都被认为是int

看一个例子

byte op1 = 4;
byte op2 = 5;
byte myResultingByte = (byte) op1 + op2;

两个操作数都被提升为int,计算的结果再次向下转换为byte

9. 结论

类型之间的转换是日常编程活动中非常常见的任务。

了解上面的这些规则可能会在查找某个代码编译原因时,节省大量时间。

最后,往常一样,代码可以在Github上找到。