您的位置:首页 > 编程语言 > Java开发

Java Puzzle

2006-09-27 23:11 441 查看
今天听Sun的一个技术大会,其中讲到一些Java Puzzle,就是一些大家不常注意到的语法细节。以前一直觉得C++语法复杂,Java简单。其实,只要程序员愿意,一样可以写出晦涩难懂的烂Java程序。

具体题目已经不记得了,这里只能凭记忆写出题的大概。

题1:




public class Confusing ...{




public Confusing(Object o) ...{


System.out.println("object");


}




public Confusing(double[] array) ...{


System.out.println("double array");


}






public static void main(String[] args) ...{


new Confusing(null);


}


}

问:输出什么?

a) object b) double array c) won't compile d) other

答:这个题输出double array。题目中两个构造函数都符合要求,因为null可以是Object,也可以是double[],这时Java会选择类型最匹配的。所以选double array。

题2:




public class Number ...{




public static void main(String[] args) ...{


System.out.println(2.00 - 1.10);


}


}

问:输出什么?

答:输出0.8999999999999999。这个倒是比较常见的问题。浮点数表示是不精确的。

题3:




public class X ...{




static public class Y ...{


static public String Z = "white";


}




static C Y;






public static void main(String[] args) ...{


System.out.println(X.Y.Z);


}


}






class C ...{


static public String Z = "black";


}

问:输出什么?

a) white b) black c) compile error d) other

答:这个选b。Java中,当名字解析时发现多个匹配的结果时,varible>type>package,所以变量Y的优先级高于类Y,优先。

题4:




public class StringLength ...{




public static void main(String[] args) ...{


final String str1 = "length =10";


final String str2 = "length =" + str1.length();




System.out.println("result is " + str1 == str2);


}


}

问:结果如何?

a) result is true b) result is false c) won't compile d) other

答:当时很多人在考虑final的string是否会由于编译器优化而使用同一个字符串,以至于==会返回true,争论在a和b。其实这个题目中由于+的优先级高于==,所以先执行字符串连接,得到的字符串再和str2比较,所以结果是输出false

题5:




public class compute ...{




public static void main(String[] args) ...{


int x = 0;




for (int i = 0; i < 3; ++i) ...{


x += x++;


}




System.out.println("x = " + x);


}


}

问:输出多少?

答:这个题目输出0,很出人意料。因为+=和++从右往左开始算,等同于x = (x + x++); 先做x+x++,其中x++返回老值0,0+0结果还是0,之后x自增长为1,最后计算结果0赋值给x,x又变成0。所以执行多少次都是0。

这个题目真是变态,上台的8个同学全都答错,没有人能领走iPod shuffle,

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: