expression1?expression2: expression3
expression1: 能够返回boolean结果的语句 可bian变量(boolean/Boolean,包装类Booean会被隐式转化为基本类型boolean)
expression2: expression1结果true时所取得结果
expression3:expression1结果为为false所取的结果
example:
int i = true ? 1 : 2; //expression1 为真 取 expression2的结果:1 Boolean flag = null; int i = flag ? 1 : 2; //flag是包装类 Boolean 类型 运行时会拆箱 调用Boolean的成员函数booleanValue 这个时候会抛异常 三目运算符装箱拆箱如果是包装类的话 三目运算会自动地做拆箱之后,再进行运算,就像上面说的Boolean会自动拆箱一样。
使用包装类型的话,需要进行必要的判空处理,否则值类的值为null时拆箱会报错
Boolean b = Boolean.FALSE; Integer integer = 1;// 数字类型字面量赋值给包装类 实际上是调用 包装类的valueOf函数 此处相当于 Integer integer = Integer.valueOf(1) int i = b ? integer : 1; //运行时 实质上是 int i = b.booleanValue() ? integer.intValue() : 1; 跨类型转换对于对象类型的三目运算符 ,expression2和expression3 返回的对象类型最好一致,否则你只能用一个超类来接收值才不会爆编译错误。
Object s = true ? "1" : new Integer(1) ;//qrdss定义s 类型时 不管是String 还是Integer都会报错数字类型的话 ,会按照最大精度的类型进行隐式转换,并且在返回结果时 会返回基本类型
double d = true ? 1 : 1.0;//最大精度的类型是double qrdss用int 接收时会爆编译异常
double d = true ? new Integer(11) : new Double(1);//包装类拆箱 即调用对应的**value方法,然后进行升精度处理