写在前面:
关于这道题,初见感觉有点cpu烧坏了,准确来说是看了网上的一些讲解都感觉不尽人意。自己整理了一下,希望能帮助到大家。
题目:
如下两个题目输出结果相同吗?各是什么。
Object o1 = true ? new Integer(1) : new Double(2.0);System.out.println(o1);//1.0Object o2;if (true) o2 = new Integer(1);else o2 = new Double(2.0);System.out.println(o2);//1
分析:
首先分析o1:Object o1 = true ? new Integer(1) : new Double(2.0);
-
三元运算符的语法是:
condition ? expression1 : expression2
- 如果
condition
为真(即true
),则选择expression1
。 - 如果
condition
为假(即false
),则选择expression2
。
- 如果
-
在该题目中,有以下表达式:
Object o1 = true ? new Integer(1) : new Double(2.0);
condition
是 true
,因此我们选择 expression1
,即 new Integer(1)
。虽然是一个整数对象,但是三元运算符的结果类型必须是操作数的共同类型。
共同类型:两个操作数的最小公共类型。
new Integer(1)
是整数类型,new Double(2.0)
是双精度浮点数类型。整数和双精度浮点数的共同类型是 Double
。因此,三元运算符的结果类型是 Double,
new Integer(1)
被自动转换为 Double
类型。所以,o1
被赋值为 1.0
,
其次分析o2:if (true) o2 = new Integer(1); else o2 = new Double(2.0);
由于条件是 true
,所以执行了 if
分支,将 o2
赋值为 new Integer(1)
。因此,o2
也被赋值为 1
。
综上,结果是相等的。
引申:不同类型数据间的转换
-
隐式类型转换(自动类型转换):
- 隐式类型转换是在编译时自动发生的,无需显式指定。
- 它允许将一个较小范围的数据类型转换为一个较大范围的数据类型。
- 例如,将
int
转换为double
或将short
转换为int
。 - 隐式类型转换不会导致数据丢失。
-
显式类型转换(强制类型转换):
- 显式类型转换需要使用强制转换运算符(例如
(type)
)来明确指定转换的目标类型。 - 它允许将一个较大范围的数据类型转换为一个较小范围的数据类型。
- 例如,将
double
转换为int
或将long
转换为short
。 - 显式类型转换可能导致数据溢出或精度丢失,因此需要谨慎使用。
- 显式类型转换需要使用强制转换运算符(例如
-
基本数据类型之间的转换:
- 整型、实型和字符型被视为简单数据类型。
- 低级到高级的自动类型转换:
- 低级变量可以直接转换为高级变量,例如:
byte b; int i = b;
- 对于
char
类型,向高级类型(整型)转换时,会转换为对应的 ASCII 码值。
- 低级变量可以直接转换为高级变量,例如:
- 高级到低级的强制类型转换:
- 使用强制类型转换,例如:
int i = 99; byte b = (byte) i;
- 使用强制类型转换,例如:
-
字符串与其他数据类型的转换:
- 将其他类型转换为字符串:
- 调用类的
toString()
方法。 - 使用自动转换:
X + ""
。 - 使用
String.valueOf(X)
。
- 调用类的
- 将字符串转换为其他类型:
- 使用静态
parseXXX
方法,例如:int i = Integer.parseInt("123");
- 使用静态
- 将其他类型转换为字符串:
-
Date 类与其他数据类型的转换:
- Date 类与整型之间的对应关系:
- 使用
Date
构造函数,例如:Date date = new Date(2023, 10, 11);
- 使用
- Date 类与长整型之间的对应关系:
- 使用
Date
构造函数,例如:Date date = new Date(1633948800000L);
- 使用
- 获取 Date 类中的年、月、日等信息,例如:
int year = date.getYear();
- Date 类与整型之间的对应关系: