java语法

1,位移运算越界怎么处理y
考察下面的代码输出结果是多少?HX
int a=5;"isO<
System.out.println(a<<33);&FA{1g
按照常理推测,把a左移33位应该将a的所有有效位都移出去了,那剩下的都是零啊,所以输出结果应该是0才对啊,可是执行后发现输出结果是10,为什么呢?因为Java语言对位移运算作了优化处理,Java语言对a<<b转化为a<<(b%32)来处理,所以当要移位的位数b超过32时,实际上移位的位数是b%32的值,那么上面的代码中a<<33相当于a<<1,所以输出结果是10。cs!AG
?www.wendangwang.com为java提供源动力  tp%
2,可以让i!=i吗?:C(pKj
当你看到这个命题的时候一定会以为我疯了,或者Java语言疯了。这看起来是绝对不可能的,一个数怎么可能不等于它自己呢?或许就真的是Java语言疯了,不信看下面的代码输出什么?7Tdc
double i=0.0/0.0;Dm
if(i==i){d"
System.out.println("Yes i==i");8&%
}else{o\l!S+
System.out.println("No i!=i");*aK9
}u
上面的代码输出"No i!=i",为什么会这样呢?关键在0.0/0.0这个值,在IEEE 754浮点算术规则里保留了一个特殊的值用来表示一个不是数字的数量。这个值就是NaN("Not a Number"的缩写),对于所有没有良好定义的浮点计算都将得到这个值,比如:0.0/0.0;其实我们还可以直接使用Double.NaN来得到这个值。在IEEE 754规范里面规定NaN不等于任何值,包括它自己。所以就有了i!=i的代码。-/!yJB
?www.wendangwang.com为java提供源动力  t
3,怎样的equals才安全?DI|
我们都知道在Java规范里定义了equals方法覆盖的5大原则:reflexive(反身性),symmetric(对称性),transitive(传递性),consistent(一致性),non-null(非空性)。那么考察下面的代码:3%aP
public class Student{D$#6
private String name;n(
private int age;l7
public Student(String name,int age){(y+n
this.name=name;t
this.age=age;\
}v]*7
public boolean equals(Object obj){N
if(obj instanceof Student){o\G4
Student s=(Student)obj;b:G0QZ
if(s.name.equals(this.name) && s.age==this.age){0o6E
return true;]Jstr
}>2[a
}#
return super.equals(obj);S.
}Vlj~
}?www.wendangwang.com为java提供源动力  0^w+`M
你认为上面的代码equals方法的覆盖安全吗?表面看起来好像没什么问题,这样写也确实满足了以上的五大原则。但其实这样的覆盖并不很安全,假如Student类还有一个子类CollegeStudent,如果我拿一个Student对象和一个CollegeStudent对象equals,只要这两个对象有相同的name和age,它们就会被认为相等,但实际上它们是两个不同类型的对象啊。问题就出在instanceof这个运算符上,因为这个运算符是向下兼容的,也就是说一个CollegeStudent

你可能喜欢

  • Java笔记
  • JAVA编程题全集及答案
  • 语法大全
  • java基础教程
  • JAVA关键字
  • java基本语法
  • java学习总结

java语法相关文档

最新文档

返回顶部