几道小小的题目一起和大家更进一步地了解Java (Ⅲ)

火龙果被占用了 2008-01-30 05:40:06
加精
这是小题目的系列之三

之一:http://topic.csdn.net/u/20070828/10/7aa61fbc-8575-4212-85c4-582c08f81535.html
之二:http://topic.csdn.net/u/20070917/10/928cdd3b-0ec6-4236-a89d-7c3ddba8eaba.html

考虑到前两期的题目可能太难了,这次把难度降低了,以最简单的代码量来说明。

做题规则:老规矩,不允许上机操作,全部完成后可以将代码复制自行检测一下,需采用JDK1.5及以上版本

1,被遗忘掉的运算符

如果问大家“&”、“|”、“^”这三个是什么运算符?基会本上都会回答“位运算符”,但这样的回答只能得50分。大多数的Java程序员很可能不知道它还能充当其他的运算符——布尔逻辑运算符(前提是两边的数据类型为布尔类型)。

在布尔逻辑运算符中这三个运算符充当着“布尔逻辑与”、“布尔逻辑或”和“布尔逻辑异或”的角色。前面两个把它们再复制一个放在一起就成了逻辑运算符。布尔逻辑与(&)和布尔逻辑或(|)运算符的工作方式同逻辑与(&&)和逻辑或(||)的工作方式相同,布尔逻辑运算符的优先级别要高于逻辑运算符,除此之外它们还有一点细微的差别,看一看下面的程序将会输出什么,就会明白了。

最后一个布尔逻辑异或(^)用得就更少了,可以采用关系运算符不等于(!=)来代替,在此就不深究了。

布尔逻辑运算符与逻辑运算符还有个区别,就是布尔逻辑运算符可以与赋值运算符(=)结合成布尔逻辑赋值运算符(&=、|=、^=),而逻辑运算符就没有这样的功能,可能它本身就有两个了吧,再结合“=”的话就变三个了,呵呵,太多了 :)

public class Test1 {
public static void main(String[] args) {
int m = 5, n = 5;
if((m != 5) && (n++ == 5)){}
System.out.println("a." + n);

m = n = 5;
if((m != 5) & (n++ == 6)){}
System.out.println("b." + n);

m = n = 5;
if((m == 5) || (n++ == 5)){}
System.out.println("c." + n);

m = n = 5;
if((m == 5) | (n++ == 6)){}
System.out.println("d." + n);
}
}


=====★==我==是==题==目==间==的==小==分==隔==符==★=====

2,自动装箱的疑惑

JDK1.5中增加了自动拆装箱的语言特性,在基本类型和包装类型之间可以相互地转换和运算。大家也都知道Java中==运算符是比较两个对象间的引用是否相同。在自动拆装箱与“==”运算符之间也会产生一些奇怪的事情,看看下面的程序将会输出什么?

public class Test2 {
public static void main(String[] args) {
int k = 100;
Integer int1 = k;
Integer int2 = k;
System.out.println("a." + (int1 == int2));
k = 200;
Integer int3 = k;
Integer int4 = k;
System.out.println("b." + (int3 == int4));

char c = 'A';
Character char1 = c;
Character char2 = c;
System.out.println("c." + (char1 == char2));
c = '国';
Character char3 = c;
Character char4 = c;
System.out.println("d." + (char3 == char4));
}
}


=====★==我==是==题==目==间==的==小==分==隔==符==★=====

3,奇怪的\u与0x

\u是Unicode字符的前缀,而0x是十六进制数值的前缀,能通用吗?下面的程序是否能如愿以偿地将Hello与World!分成两行输出呢?

public class Test3 {
public static void main(String[] args) {
// 提示 \u000A 表示换行(LF),而 0x000A 表示什么呢?
char c = 0x000A;
System.out.println("Hello" + c + "World!");
}
}


=====★==我==是==题==目==间==的==小==分==隔==符==★=====

4,不可能发生的事情


来个简单点的填空题哈,在空格处填上适当的数,让下面的程序能输出“Hello World!”。

public class Test4 {
public static void main(String[] args) {
int num = _____________;
if(num < 0 && num == Math.abs(num)) {
System.out.println("Hello World!");
}
}
}


=====★==我==是==题==目==间==的==小==分==隔==符==★=====

5,模棱两可的方法重载

invoke有两个重载的方法,一个是Object作为参数,另一个是int[]作为参数,看看下面的程序会输出什么?

public class Test5 {
public static void main(String[] args) {
invoke(null);
}
private static void invoke(Object obj) {
System.out.println("Object");
}
private static void invoke(int[] nums) {
System.out.println("Arrays");
}
}


=====★==我==是==题==目==间==的==小==分==隔==符==★=====

6,Number引起的计算错误

Number是众多数值类型的抽象父类,难道用它会引发计算错误?!看看下面的程序会输出什么?

public class Test6 {
public static void main(String[] args) {
Number num = 12345 + 5432l;
System.out.println(num.intValue());
}
}


以上题目参考或改编自:
[1] H.M.Deitel, P.J.Deitel,Java程序设计教程,清华大学出版社,2004
[2] D.Flanagan, Java in a Nutshell, 5th ed., O'Reilly Media, 2005
[3] B.McLaughlin, D.Flanagan, Java 5.0 Tiger程序高手秘笈,东南大学出版社,2005
[4] Sun Microsystems, The Java Language Specification, 3rd ed., Addison-Wesley, 2005
[5] Joshua Bloch, Neal Gafter, Java解惑,人民邮电出版社,2006
[6] Joshua Bloch, Effective Java中文版,机械工业出版社,2003
...全文
6733 139 打赏 收藏 转发到动态 举报
写回复
用AI写文章
139 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxy15329 2012-08-15
  • 打赏
  • 举报
回复
确实挺有意思的,以前都没有认真想过
guiyang50302 2012-04-03
  • 打赏
  • 举报
回复
不会,我初学者
zhaoqq921711784 2012-03-28
  • 打赏
  • 举报
回复
第五题不懂啊,求大婶解答
szx0704 2012-03-15
  • 打赏
  • 举报
回复
第四题。。查API文档得这个:注意,如果参数等于 Integer.MIN_VALUE 的值(即能够表示的最小负 int 值),那么结果与该值相同且为负。这是math方法的。。。。有了这个大家就知道填什么了。。
NormalIsBoring 2012-03-14
  • 打赏
  • 举报
回复
8错8错 学习了
FJC394744352 2012-03-13
  • 打赏
  • 举报
回复
我是初学者 这个正适合
tony_ash5566 2012-02-08
  • 打赏
  • 举报
回复
mark
志慧 2012-02-06
  • 打赏
  • 举报
回复
很好,受益匪浅
javawangke 2012-01-29
  • 打赏
  • 举报
回复
求解。第四题 输入多少 ,可以输出helloWorld? 解释
第五题invoke调用null 为什么调用的是数组而不是对象?
尼伯龍根 2012-01-10
  • 打赏
  • 举报
回复
经典啊 顶一下
流觞夜未央 2011-11-30
  • 打赏
  • 举报
回复
挺好,嘿嘿!
kyng1988 2011-10-28
  • 打赏
  • 举报
回复
好好学习
狗狗 2011-09-05
  • 打赏
  • 举报
回复
到现在还有人顶
jphh2011 2011-09-03
  • 打赏
  • 举报
回复
学习学习!
小白痴 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 java2000_net 的回复:]

Java code
public class Test6 {
public static void main(String[] args) {
Number num = 12345 + 5432l;
System.out.println(num.intValue());
}
}

12345
5432
------
17777 啊!这个……
[/Quote]num = 12345+5432L(L的小写是l)
hh2870714 2011-05-26
  • 打赏
  • 举报
回复
不错 学习了~~
lg_asus 2011-05-19
  • 打赏
  • 举报
回复
火龍果大哥,頂你
w521111 2011-01-21
  • 打赏
  • 举报
回复
MARK
qihigh 2011-01-15
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 yuanyuan110_l 的回复:]

对于自动装箱的疑惑
想了下还是不是很懂
int k = 100;
Integer int1 = k;
Integer int2 = k;
执行的应该是Integer int1 = Integer.value(k);
这个方法在jdk的帮助中说是
"如果不需要新的 Double 实例,则通常应该优先采用此方法,而不是使用构造方法 Double(double),因为该方法很可能通过缓……
[/Quote]

因为100被创建后会缓存,而超过127的200不会被缓存!~~~~
郑宏辉 2010-11-24
  • 打赏
  • 举报
回复
Test1 5 6 5 6
Test2 不明白为什么?
Test3 通过换算与查ASCII代码知道是换行符LF
Test4 顺便写个负数
Test5 不懂,要学习
Test6 不理解
加载更多回复(119)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧