我的Java开发学习之旅------>解惑Java进行三目运算时的自动类型转换

简介: 今天看到两个面试题,居然都做错了。通过这两个面试题,也加深对三目运算是的自动类型转换的理解。 题目1.以下代码输出结果是()。 public class Test { public static void main(String[] args) { int a=5; System.

今天看到两个面试题,居然都做错了。通过这两个面试题,也加深对三目运算是的自动类型转换的理解。

题目1.以下代码输出结果是()。

public class Test {
	public static void main(String[] args) {
		int a=5;
		System.out.println("value is :"+((a<5)?10.9:9)); 
	}
}


A.编译错误     B.10.9           C.9           D.以上答案都不对


我不假思索的就选了C,认为这题目也太简单了吧。而答案却是:D.以上答案都不对。原来我中了此题目的陷阱了。

解析:三目运算表达式(expression1 ? expression2 : expression3),即本题中的表达式:((a<5)?10.9:9),第二个表达式为10.9,第三个表达式为9。这是Java会根据运算符的精度进行自动类型转换。由于10.9的原因,9也会自动变成9.0。因此此题的真正输出为 9.0 。


题目2.以下代码的输出结果是()。

public class Test  {
	public static void main(String[] args) {
		char x='x';
		int i=10;
		System.out.println(false?i:x);    
		System.out.println(false?10:x);  
	}
}



A. 120  x              B.120 120                 C.x 120              D.以上答案都不对


答案为:A.120  x。

解析:

int i=10;中的i是一个变量,因此,第一个输出x被提升为int型,x的int值为120,所以第一个输出为120。

至于第二个输出,Java编程规范中提到:当后两个表达式有一个是常量表达式时,另外一个类型是T时,而常量表达式可以被T表示时,输出结果是T类型。所以,因为10是常量,可以被char表示。输出结果是char型,所以输出为x。

System.out.println(true?100:x);   这句的输出结果为:d。因为d是100对应的char值。



下面是Oracle官方中的一段原文:

15.25.2. Numeric Conditional Expressions

Numeric conditional expressions are standalone expressions (§15.2).

The type of a numeric conditional expression is determined as follows:

  • If the second and third operands have the same type, then that is the type of the conditional expression.

  • If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

  • If one of the operands is of type byte or Byte and the other is of type short or Short, then the type of the conditional expression is short.

  • If one of the operands is of type T where T is byteshort, or char, and the other operand is a constant expression (§15.28) of type int whose value is representable in type T, then the type of the conditional expression is T.

  • If one of the operands is of type T, where T is ByteShort, or Character, and the other operand is a constant expression of type int whose value is representable in the type Uwhich is the result of applying unboxing conversion to T, then the type of the conditional expression is U.

  • Otherwise, binary numeric promotion (§5.6.2) is applied to the operand types, and the type of the conditional expression is the promoted type of the second and third operands.

    Note that binary numeric promotion performs value set conversion (§5.1.13) and may perform unboxing conversion (§5.1.8).

翻译过来就是:

如果第二和第三个操作数在可以转换为数值类型时,会有以下几种情况:
操作数其中一个是 byte 或 Byte 类型,而另一个是 short 或 Short 类型,那么这个表达式就是 short 类型
操作数中的一个是类型 T (T 可以是 byte、short 或者是 char 类型),而另一个是 int 类型的常数,其可以用 T 类型来表示时,那么这个表达式就是 T 类型
操作数中的一个是 Byte 类型,而另一个是 int 类型的常数,其可以用 byte 类型来表示,那么这个表达式就是 byte 类型
操作数中的一个是 Short 类型,而另一个是 int 类型的常数,其可以用 short 类型来表示,那么这个表达式就是 short 类型
操作数中的一个是 Character 类型,而另一个是 int 类型的常数,其可以用 char 类型来表示,那么这个表达式就是 char 类型
否则,双目数值提升(binary numeric promotion)会被用于操作数的类型中,条件表达式的类型是第二个和第三个操作数提升后的类型。注意:双目数值提升时进行拆箱转换和值集转换(value set conversion)




关于更多关于三目运算符(Conditional Operator ? :)的介绍可以查看Oracle公司的官方文档,地址如下:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25


关于Boxing Conversion的介绍查看Oracle公司的官方文档,地址如下:

http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.7


下面两篇文章也有一定的参考性:


http://www.educity.cn/wenda/371183.html



==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/ouyang_peng

==================================================================================================



相关文章
|
7天前
|
小程序 数据可视化 Java
Java+后端Spring boot 开发的全套UWB定位方案,0.1米高精度定位系统源码
UWB定位系统由硬件定位设备、定位引擎和应用软件组成。该定位系统应用软件支持PC端和移动端访问,并提供位置实时显示、历史轨迹回放、人员考勤、电子围栏、行为分析、智能巡检等功能。定位精度高达10cm,同时具备高动态、高容量、低功耗的优点。应用场景包括:隧道、化工、工厂、煤矿、工地、电厂、养老、展馆、整车、机房、机场等。
32 8
|
3天前
|
传感器 小程序 搜索推荐
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
通过电子班牌设备和智慧校园数据平台的统一管理,在电子班牌上,班牌展示、学生上课刷卡考勤、考勤状况汇总展示,课表展示,考场管理,请假管理,成绩查询,考试优秀标兵展示、校园通知展示,班级文化各片展示等多种化展示。
24 0
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
|
8天前
|
Java API C++
Java JNI开发时常用数据类型与C++中数据类型转换
Java JNI开发时常用数据类型与C++中数据类型转换
13 0
|
8天前
|
存储 Java
Java入门——数据类型、自动类型转换、强制类型转换
Java入门——数据类型、自动类型转换、强制类型转换
11 2
|
1天前
|
前端开发 JavaScript Java
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
|
1天前
|
前端开发 JavaScript Java
计算机Java项目|热门网游推荐网站的设计与开发
计算机Java项目|热门网游推荐网站的设计与开发
计算机Java项目|热门网游推荐网站的设计与开发
|
2天前
|
SQL Java 数据库连接
JavaWeb Mapper代理开发
JavaWeb Mapper代理开发
|
2天前
|
Java
JAVA高级部分学习小结(2023.11.4)
JAVA高级部分学习小结(2023.11.4)
|
2天前
|
监控 安全 自动驾驶
基于java+单体服务 + 硬件(UWB定位基站、卡牌)技术架构开发的UWB室内定位系统源码 UWB定位技术 超宽带定位 高精度定位系统源码
基于java+单体服务 + 硬件(UWB定位基站、卡牌)技术架构开发的UWB室内定位系统源码 UWB定位技术 超宽带定位 高精度定位系统源码
14 3
|
6天前
|
安全 Java Android开发
Kotlin与Java:Android开发的双剑合璧
【6月更文挑战第9天】Kotlin和Java在Android开发中形成互补态势。Java凭借广泛社区支持和丰富的类库资源占据主导,但其语法繁琐和空指针问题限制了发展。Kotlin,设计来解决这些问题,以其简洁、安全、高效的特性逐渐兴起。Kotlin的互操作性允许与Java无缝集成,提升开发效率,减少错误。两者结合提高了代码质量和开发者的灵活性,促进了Android开发社区的繁荣。开发者应把握这种&quot;双剑合璧&quot;,适应技术发展。
20 10