首先看一下三元运算符的格式

[条件语句] ? [表达式1] : [表达式2]

其中如条件语句为真执行表达式1,否则执行表达式2.简单的例子就不举了,来点其它的。在JDK1.5以前的版本中,表达式1和表达式2都要求是相同的类型,比如都是String或者char之类的,在JDK1.5以后,有了自动拆箱和装箱的原因,两者只要其中一种或者两者都能被拆箱即可,比如表达式1为Integer,而表达式2为int类型的,比如如下

1 int a = 1;2 Integer b = 2;3 boolean c = ture;4 int d = c ? b : a;

还有个需要注意的是,如果表达式1和表达式2的类型不相同,那么他们需要对交集类型的自动参考转换。例如如下这段代码

1 String str = "abc";2 StringBuilder strbu = new StringBuilder("def");3 boolean boo = true;4 CharSequence cs = boo ? str : strbu;

因为String和StringBuilder都实现了CharSequence这个接口。

确定条件表达式结果类型的规则的核心是以下3点:

1 如果表达式1和表达式2操作数具有相同的类型,那么它就是条件表达式的类型。

2 如果一个表达式的类型是byte、short、char类型的,而另外一个是int类型的常量表达式,且它的值可以用类型byte、short、char三者之一表示的,那么条件表达式的类型就是三者之一

3 否则,将对操作数类型进行二进制数字提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型

以上的三点可以用如下的代码来帮助理解:

1 char ch = 'a';2 int num = 0;3 boolean bool = true;4 System.out.print( bool ? ch : 0);  //这里不是 bool ? ch : num ,那样会打印两个975 System.out.print( !bool ? num : ch);

这段代码打印的是 a97 。很显然,第二点的规则应用到第一个打印上了,返回的是char,第三点的规则应用到第二个打印上了,返回的是int 。但是谁会在乎这个顺序导致的打印结果,所以为了避免不必要的麻烦,很显然显式强制类型转换是个很不错的选择 -_-

1 char ch = 'a';2 int num = 0;3 boolean bool = true;4 System.out.print( bool ? (char)ch : (char)0);5 System.out.print( !bool ? (int)num : (int)ch);

还有值得注意的是 表达式1 和 表达式2 不一定非得是数据类型,还可以是自己定义的方法,只要方法有返回值就行。例如

1 static int test1(inti) {2 i += 1;3 returni;4

5 }6

7 static int test2(inti) {8 i += 2;9 returni;10 }11

12 public static voidternary() {13 boolean boo = false;14 int c = boo ? test1(1) : test2(2);15 }

以上就是个人的一点小心得~~有些内容可以参考条件表达式规范[JLS 15.25]

java 三元表达式_Java探究心得之三元运算符相关推荐

  1. java使用:: 表达式_Java 13:切换表达式的增强功能

    java使用:: 表达式 您可能还记得我以前的文章,在Java 12中,传统的switch语句得到了增强,因此可以用作表达式. 在Java 13中,对该功能进行了进一步的更改 . break语句不能再 ...

  2. java使用:: 表达式_Java 12:开关表达式

    java使用:: 表达式 在Java 12中,对switch语句进行了增强,以便可以将其用作表达式. 现在也可以在一种情况下打开多个常量,从而使代码更简洁易读. 这些增强功能是一种预览语言功能 ,这意 ...

  3. java if赋值语句_Java基础第3天+运算符(算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元运算符)、Scanner键盘录入、if语句...

    1:运算符(掌握) (1)算术运算符 A:+,-,*,/,%,++,-- B:+的用法 a:加法 b:正号 c:字符串连接符 C:/和%的区别 数据做除法操作的时候,/取得是商,%取得是余数 D:++ ...

  4. java cron表达式_Java 程序员都应该去使用一下这款强大的国产工具类库

    大家好,我是你们的导师, 我会坚持每天给大家整理一些干货内容(当然周末也要允许老师休息一下哈). 今天给大家分享一个很棒的Java工具类库:Hutool.可能有很多朋友已经知道这个类库了,甚至在已经在 ...

  5. java规则表达式_Java基础--正则表达式的规则

    注意:正则表达式只关注格式是否正确,不关注内容是否有效. 一.字符集合, []表示一个字符. 1.[abc] :指a,b,c中的任意一个字符. 2.[^abc]:指除了a,b,c外的任意字符. 3.[ ...

  6. java ognl表达式_java -------ognl表达式入门

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 ----------------------------------------------------------------------------- ...

  7. java AST 表达式_java AST JCTree简要分析

    JCTree简要分析 [toc] JCAnnotatedType 被注解的泛型:(注解的Target为ElementType.TYPE_USE时可注解泛型) public static class A ...

  8. java 比较表达式_java学习之运算符与表达式(三)

    逻辑运算符 逻辑运算即对布尔类型进行的与.或.非.异或等的运算,其运算结果仍为布尔类型. 逻辑运算符有6个:&(与).\(或).!(非).^(异或).&&(条件与).||(条件 ...

  9. java 自定义表达式_Java中使用Groovy实现自定义表达式解析

    Groovy作为一种JVM-Based语言,目前普及程度正在提高.本文演示一下在Java类中,通过继承GDK的groovy.lang.Script类如何支持自定义表达式解析功能. 输入: 表示一行数据 ...

最新文章

  1. 通俗理解tf.name_scope()、tf.variable_scope()
  2. link 和@import 的区别?
  3. 简单好听的id_一位妈妈给孩子的10大家规,简单实用,值得所有父母借鉴!
  4. python画曲线-如何通过python画loss曲线的方法
  5. 招聘 Java 和 前端工程师
  6. 树莓派Raspberry命令行配置无线网络连接
  7. 【转载】关于 Google Chrome 中的全屏模式和 APP 模式
  8. Mysql中default分区,MySQL中的分区(六)KEY分区
  9. dedecms怎么改php版本_php.ini配置中有3处设置不当会使网站存在安全问题
  10. java注释指导手册
  11. java 程序出现标点错误,我是学java的新手,下面代码出现报错,请问是什么原因?如何解决?...
  12. 如何用matlab计算不确定度,Matlab计算“间接测量物理量的不确定度”
  13. 神经网络matlab仿真,神经网络模型及其MATLAB仿真程序设计 周开利 等著 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  14. 用python画环形图
  15. 学习并行计算(CUDA Python)-1-初尝试
  16. NovaMind *的安装、和谐破解到永久使用
  17. post获取网页post用法
  18. 使用国内镜像站下载树莓派 Raspberry Pi OS 操作系统
  19. 微软面试题【飞机加油问题】题解
  20. loss损失不下降的原因

热门文章

  1. Linux修改时区的正确方法
  2. 去中心化的即时通讯协议,如何引爆通讯领域的新一轮革命?
  3. Steam 客户端将原生适配 Chrome OS
  4. 使用Fiddler后谷歌浏览器访问https不安全
  5. 【前端】使用ffmpeg+vue3实现简单的视频编辑器
  6. java实现 定时_Java实现定时任务的几种方案重构
  7. ​git拉取远程分支到本地 ​
  8. 体系建设的核心任务--明确目标
  9. 2018湖北省大学程序设计竞赛 D. Who killed Cock Robin
  10. mysql获取json数据