刚刚在论坛上看到几个题目都很灵,所以收藏起来,慢慢分析,慢慢研究 -_- (更新中。。。)
看看下面的程序会输出什么
public
class
Test
...
{
public static void main(String[] args) ...{
for (int i = 0; i <= 10; i++)
Integer k = new Integer(i);
System.out.println("Java Puzzlers ");
}
}
public static void main(String[] args) ...{
for (int i = 0; i <= 10; i++)
Integer k = new Integer(i);
System.out.println("Java Puzzlers ");
}
}
解析:
此题编译不通过
局部变量的作用范围是在一个块内,也可以理解为在“{ }”内。for 循环可以不使用“{ }”的,但仅限于执行语句(其中并不包括变量声明语句),因此这段代码中的 Integer k 的作用范围是在整个 main 方法之中,这样就造成了变量重复定义,在编译时会报出缺“;”的错误(实际上是缺 for 后面的一个分号)。所以根据这样的一个特点,在编写代码时尽量使用标准的语句,哪怕循环体内只有一行,也应用花括号包起来,以免产生错误。
看看下面的程序会输出什么
public
class
Test
...
{
public static void main(String[] args) ...{
Parent parent = new Parent();
Parent child = new Child();
System.out.println(parent.getName());
System.out.println(child.getName());
}
}
class Parent ... {
public String getName() ...{
return "Parent ";
}
}
class Child
extends Parent ... {
public String getName() ...{
return "Child ";
}
}
public static void main(String[] args) ...{
Parent parent = new Parent();
Parent child = new Child();
System.out.println(parent.getName());
System.out.println(child.getName());
}
}
class Parent ... {
public String getName() ...{
return "Parent ";
}
}
class Child
extends Parent ... {
public String getName() ...{
return "Child ";
}
}
解析:
此题的输出为:
Parent
Parent
静态的方法不存在重载,所以子类和父类的getName()方法不属于重载。因此执行哪一个方法,就完全决定于你调用了哪个类。
看看下面的程序会输出什么
public
class
Test
...
{
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");
}
}
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");
}
}
解析:
此题输出为:Arrays
Java的重载解析过程是以两阶段运行的。第一阶段选取所有可获得并且可应用的方法或构造器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性。
参数为Object的构造器可以接收所有int[] nums的参数,所以它不够精确.所以调用的是int[] nums为参数的构造器。
在空格处填上适当的数,让下面的程序能输出“Hello World!”
public
class
Test
...
{
public static void main(String[] args) ...{
int num = _____________;
if(num < 0 && num == Math.abs(num)) ...{
System.out.println("Hello World!");
}
}
}
public static void main(String[] args) ...{
int num = _____________;
if(num < 0 && num == Math.abs(num)) ...{
System.out.println("Hello World!");
}
}
}
解析:
此题答案为Integer.MIN_VALUE
Integer.MIN_VALUE的值为-2
32,即二进制位中最高位(符号位)为“1”,其余的位均为“0”的四字节数。Math.abs的运算是先看看参数的值是否是小于零的,若是小于零的,在前面加个负号(-),加负号的运算也就相当于,把整个二进制位取反再加1,Integer.MIN_VALUE,取反后最高位为“0”,其余都为“1”了,再加“1” 之后即得到了自身
看看下面的程序会输出什么
public
class
Test
...
{
public static void main(String[] args) ...{
int k = 200;
Integer int1 = k;
Integer int2 = k;
System.out.println("a." + (int1 == int2));
k = 100;
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));
}
}
public static void main(String[] args) ...{
int k = 200;
Integer int1 = k;
Integer int2 = k;
System.out.println("a." + (int1 == int2));
k = 100;
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));
}
}
解析:
基本类型的自动装箱是通过其包装对象的valueOf()方法实现的,一些特定的基本类型值被装箱后的对象
会被高速缓存以重复使用,并且会被当作一般使用的对象。
这些特殊的值是:
boolean: true、false
byte: 所有的值
short、int和long: -128~127
char: /u0000~/u007F
float和double:不会被缓存
故本题输出为:
boolean: true、false
byte: 所有的值
short、int和long: -128~127
char: /u0000~/u007F
float和double:不会被缓存
故本题输出为:
false
true
true
false
看看下面的程序会输出什么
public
class
Test
...
{
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);
}
}
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);
}
}
解析:
逻辑运算符和位运算符都可以对布尔值进行操作,但逻辑运算符是被优化过的,具有短路功能,而位运算符没有该功能。
下面是一个三目运算符的小题目,看看程序运行后,在控制台上会输出_____。
A. 3
B. 1.0
C. 抛出异常
D. 以上都不是
A. 3
B. 1.0
C. 抛出异常
D. 以上都不是
import
java.util.Random;
public class Test ... {
public static void main(String[] args) ...{
Random rnd = new Random();
boolean toBe = rnd.nextBoolean();
Number result = (toBe || !toBe) ?
new Integer(3) : new Float(1);
System.out.println(result);
}
}
public class Test ... {
public static void main(String[] args) ...{
Random rnd = new Random();
boolean toBe = rnd.nextBoolean();
Number result = (toBe || !toBe) ?
new Integer(3) : new Float(1);
System.out.println(result);
}
}
解析:
如果条件表达式的第二和第三个操作数可以转换为数值类型,则会在运算时做类型提升,故本题答案为3.0,选D
这个题,可以告诉我们不要在条件运算的操作数中使用不同的数据类型,并且条件运 算符与 if...else 结构性质并不是完全相同的。
看看下面的这段程序,输出的是_____。
A. 4
B. 5
C. 6
D. 以上都不是
A. 4
B. 5
C. 6
D. 以上都不是
import
java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
public class Test ... {
private static final String[] URL_NAMES = ...{
"http://javapuzzlers.com",
"http://apache2-snort.skybar.dreamhost.com",
"http://www.google.com",
"http://javapuzzlers.com",
"http://findbugs.sourceforge.net",
"http://www.cs.umd.edu"
};
public static void main(String[] args) throws MalformedURLException ...{
Set<URL> favorites = new HashSet<URL>();
for (String urlName : URL_NAMES)
favorites.add(new URL(urlName));
System.out.println(favorites.size());
}
}
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
public class Test ... {
private static final String[] URL_NAMES = ...{
"http://javapuzzlers.com",
"http://apache2-snort.skybar.dreamhost.com",
"http://www.google.com",
"http://javapuzzlers.com",
"http://findbugs.sourceforge.net",
"http://www.cs.umd.edu"
};
public static void main(String[] args) throws MalformedURLException ...{
Set<URL> favorites = new HashSet<URL>();
for (String urlName : URL_NAMES)
favorites.add(new URL(urlName));
System.out.println(favorites.size());
}
}
解析:
此题在联网的状态下会输出“4 ”,在断网的状态下会输出“5 ”,这是由于 URL 的 equals 比对方式
根据 equals 的 API DOC 说明
如果两个主机名可解析为同一 IP 地址,则认为两个主机相同;如果有一个主机名无法
解析,但两个主机名相等(不区分大小写),或者两个主机名都为 null,则也认为这
两个主机相同。
也就是说,如果两个 URL 的 IP 地址是相同的,那么这两个 URL 就是相等的。
可能大家会没注意到:
http://javapuzzlers.com
http://apache2-snort.skybar.dreamhost.com
第一和第二个的 IP 地址是相同的,都是 208.97.154.9 ,所以在 Set 时都把它们当成同一个了。
如果在没有网络的条件,这些都是无法解析成为 IP 地址的,这时就判断 URL 的名字了,仅认为名字
相同时才是相同的 URL。
这道题告诉我们,不要把 URL 应用于 Set 和 Map 的 key 中,可以使用 URI 来代替,这样就不存在
有无网络的问题了。这是由于 URL 的 equals 比对方式
根据 equals 的 API DOC 说明
如果两个主机名可解析为同一 IP 地址,则认为两个主机相同;如果有一个主机名无法
解析,但两个主机名相等(不区分大小写),或者两个主机名都为 null,则也认为这
两个主机相同。
也就是说,如果两个 URL 的 IP 地址是相同的,那么这两个 URL 就是相等的。
可能大家会没注意到:
http://javapuzzlers.com
http://apache2-snort.skybar.dreamhost.com
第一和第二个的 IP 地址是相同的,都是 208.97.154.9 ,所以在 Set 时都把它们当成同一个了。
如果在没有网络的条件,这些都是无法解析成为 IP 地址的,这时就判断 URL 的名字了,仅认为名字
相同时才是相同的 URL。
这道题告诉我们,不要把 URL 应用于 Set 和 Map 的 key 中,可以使用 URI 来代替,这样就不存在
有无网络的问题了。这是由于 URL 的 equals 比对方式