问题描述
- 关于三目运算的奇怪之处。
-
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);结果为什么是1.0?新手上路,求高手解答。
解决方案
三目运算符也称三元一次运算符,他的规则是 x?y:z,其中x是boolean值,也就是个判断,如果为真(true)值就取y,如果为假(false),值就取z,他也可以写成if(x){y}esle{z};再来看你这里的Object o1 = true ? new Integer(1) : new Double(2.0);其实你这里面包含一个三元一次运算符和一个赋值运算,因为三目运算符的优先级高于赋值运算符,所以先运行三目运算符,得到new Integer(1) ,等式就变成了Object o1 =new Integer(1) ,就得到o1new了个Integer对象,赋值为1,所以打印的就是1。
解决方案二:
当然是1.0,首先三目的判断条件是 true,然后整表达式有 Double,所以 Object 被隐式转换为Double,否则有数据丢失,编译器不会这样做。最终机器运行的表达式应该是这样的
Double o1 = true==true ? new Integer(1) : new Double(2.0);
解决方案三:
Object o1 = true 为真, 则创建整形赋值为1, 否则创建double类型并且赋值2.0 , 但输出o1仍然是TRUE, 也就是说他的值是不会因为3目运算符而变的
解决方案四:
还是会进行类型转换的吧, 虽然你用的是基本类型的包装类:
Integer o1 = true ? new Integer(1) : new Double(2.0); 这个是错的
Double o1 = true ? new Integer(1) : new Double(2.0); 这个是对的
解决方案五:
Object o1 = true ? (Object) new Integer( 1 ) : (Object) new Double( 2.0 );
System.out.println( o1.getClass().getName() );
你可以尝试将某一个变量强转成Object 这样o1的类型就是Integer了
解决方案六:
true就直接走第一个了啊,http://blog.jobbole.com/93511/
解决方案七:
明显低升高,自动转了数据类型
解决方案八:
明显低升高,自动转了数据类型
解决方案九:
2个操作数从byte,short,char,int 4个中选2个时,能用小的类型表示大的类型,输出结果的类型是小的类型,如果包括一个long,float,double操作数,那么输出结果的类型是大的类型