打字猴:1.700438486e+09
1700438486
1700438487 问题就出在了100和100.0这两个数字上,在变量s中,三元操作符中的第一个操作数(90)和第二个操作数(100)都是int类型,类型相同,返回的结果也就是int类型的90,而变量s1的情况就有点不同了,第一个操作数是90(int类型),第二个操作数却是100.0,而这是个浮点数,也就是说两个操作数的类型不一致,可三元操作符必须要返回一个数据,而且类型要确定,不可能条件为真时返回int类型,条件为假时返回float类型,编译器是不允许如此的,所以它就会进行类型转换了,int型转换为浮点数90.0,也就是说三元操作符的返回值是浮点数90.0,那这当然与整型的90不相等了。这里可能有读者疑惑了:为什么是整型转为浮点,而不是浮点转为整型呢?这就涉及三元操作符类型的转换规则:
1700438488
1700438489 若两个操作数不可转换,则不做转换,返回值为Object类型。
1700438490
1700438491 若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。
1700438492
1700438493 若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型(可以参考“建议22”,会对该问题进行展开描述)。
1700438494
1700438495 若两个操作数都是直接量数字(Literal)[1],则返回值类型为范围较大者。
1700438496
1700438497 知道是什么原因了,相应的解决办法也就有了:保证三元操作符中的两个操作数类型一致,即可减少可能错误的发生。
1700438498
1700438499 [1]“Literal”也译作“字面量”。
1700438500
1700438501
1700438502
1700438503
1700438504 编写高质量代码:改善Java程序的151个建议 [:1700438071]
1700438505 编写高质量代码:改善Java程序的151个建议 建议4:避免带有变长参数的方法重载
1700438506
1700438507 在项目和系统的开发中,为了提高方法的灵活度和可复用性,我们经常要传递不确定数量的参数到方法中,在Java 5之前常用的设计技巧就是把形参定义成Collection类型或其子类类型,或者是数组类型,这种方法的缺点就是需要对空参数进行判断和筛选,比如实参为null值和长度为0的Collection或数组。而Java 5引入变长参数(varags)就是为了更好地提高方法的复用性,让方法的调用者可以“随心所欲”地传递实参数量,当然变长参数也是要遵循一定规则的,比如变长参数必须是方法中的最后一个参数;一个方法不能定义多个变长参数等,这些基本规则需要牢记,但是即使记住了这些规则,仍然有可能出现错误,我们来看如下代码:
1700438508
1700438509 public class Client{
1700438510
1700438511 //简单折扣计算
1700438512
1700438513 public void calPrice(int price, int discount){
1700438514
1700438515 float knockdownPrice=price*discount/100.0F;
1700438516
1700438517 System.out.println(“简单折扣后的价格是:”+formateCurrency(knockdownPrice));
1700438518
1700438519 }
1700438520
1700438521 //复杂多折扣计算
1700438522
1700438523 public void calPrice(int price, int……discounts){
1700438524
1700438525 float knockdownPrice=price;
1700438526
1700438527 for(int discount:discounts){
1700438528
1700438529 knockdownPrice=knockdownPrice*discount/100;
1700438530
1700438531 }
1700438532
1700438533 System.out.println(“复杂折扣后的价格是:”+formateCurrency(knockdownPrice));
1700438534
1700438535 }
[ 上一页 ]  [ :1.700438486e+09 ]  [ 下一页 ]