02-07 java语言基础(数据类型转换)

数据类型转换之隐式转换

02-07 java语言基础(数据类型转换)_第1张图片
图中有6个实线箭头,表示无信息丢失的转换,另外有三个虚线箭头,表示可能有精度损失的转换。

当用一个二元运算符连接两个值时,需要将两个操作数转换为同一种类型,然后再进行计算:

  • 如果两个操作数其中有一个是double类型,另一个操作数就会转换为double类型。
  • 否则,如果其中一个操作数是float类型,另一个操作数就会转换为float类型。
    间接说明,float的取值范围大于long的取值范围,虽然float只占4个字节,而long占8个字节
  • 否则,如果其中一个操作数是long类型,另一个操作数就会转换为long类型。
  • 否则,两个操作数都将被转换为int类型。

float和long类型进行运算,自动转换为float类型:

public class DataType01 {
     

	public static void main(String[] args) {
     
		// TODO Auto-generated method stub
		//float和long类型进行运算,自动转换为float类型
		float a = 10;
		Long b = 11L;
		float c = a + b;
		System.out.println(c);
	}
}

byte和int类型进行运算,自动转换为int类型:

public class DataType02 {
     

	public static void main(String[] args) {
     
		// TODO Auto-generated method stub
		byte a = 10;
		int b = 20;
		int c = a + b;
		System.out.println(c);
	}

}

数据类型转换之强制类型转换

在上一节中我们看到,在必要的时候,int类型的值将会自动地转换为double类型。但另一方面,有时也需要将double转换为int。在Java中,允许这种数值之间的类型转换,当然可能会丢失一些信息。这种可能损失信息的转换要通过强制类型转换(cast)来完成。

将double类型变量强制转换为int类型:

public class DataType03 {
     

	public static void main(String[] args) {
     
		// TODO Auto-generated method stub
		double a = 37.5;
		System.out.println((int)a);
	}

}

面试题

以下程序是否有问题?

例1:

byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;

这个程序有问题,因为byte类型的量和byte类型的量相加,会转换为int类型,int类型的量赋值给byte类型的b3,会报精度损失错误。

例2:

byte b3 = 3 + 4;

这个程序没问题,因为Java编译器有常量优化机制,只要3+4的结果在byte类型的所能表示的数值范围内,就可以赋值。

字符和字符串参与运算

例1:

System.out.println('a' + 1);

输出98。这是因为字符与int类型相加,字符会转换为int类型,其依据是ASCII表,所以’a’会相应地转换为97,加1后结果为98。

例2

System.out.println("a" + 1)

输出a1,这是因为任何数据类型与字符串相加(注意只能是相加)都会产生新的字符串。

例3:

System.out.println("Hello" + 'a' + 1);  //输出Helloa1
System.out.println('a' + 1 + "Hello");  //输出98Hello

前者输出Helloa1,后者输出98Hello。

例4:

System.out.println("5 + 5 = " + 5 + 5);    //输出 5 + 5 = 55
System.out.println("5 + 5 = " + (5 + 5));  //输出 5 + 5 = 10

可以用括号改变运算的优先级,来调整转换为字符串的时机。

你可能感兴趣的:(Java基础,java)