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,
。
具体题目已经不记得了,这里只能凭记忆写出题的大概。
题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,
。
相关文章推荐
- Java Puzzlers 之Puzzle 4: It's Elementary
- Java Puzzlers笔记--puzzle 10: Tweedledee += 问题(2)
- Java Puzzlers笔记--puzzle 15: Hello Whirled -Unicode字符问题
- Java Puzzle
- Java Puzzlers笔记--puzzle 22:Dupe of URL url的使用
- Java Puzzlers 之Puzzle 2: Time for a Change
- java puzzle
- Java: A Puzzle about Constructor…
- Java Puzzlers笔记--Puzzle 1: Oddity奇偶问题
- Java解惑(四) puzzle 36--45
- Java Puzzlers笔记--Puzzle 2: Time for a change 关于浮点型的问题
- Java Puzzlers笔记--puzzle 5: The joy of Hex 十六进制计算问题
- Java Puzzlers笔记--puzzle 11: The last laugh "" 与''的区别
- Java Puzzlers笔记--puzzle 17: Huh? 转义字符问题
- Java解惑(三) puzzle 24--35
- Java Puzzlers笔记--puzzle 6: Multicast 类型转换
- Java Puzzlers笔记--puzzle 12: ABC String与char的区别
- Java Puzzlers笔记--puzzle 19: Classy Fire 注释问题
- Java Puzzlers 之Puzzle 1: Oddity
- [java puzzles]puzzle:Oddity