java解惑(谜题49。。)

谜题49:比生命更大
import java.util.Calendar;

public class Elvis {
	public static final Elvis INSTANCE = new Elvis();
	private final int beltSize;
	private static final int CURRENT_YEAR = Calendar.getInstance().get(
			Calendar.YEAR);

	public static void main(String[] args) {

		System.out.println("Elvis wears a size " + INSTANCE.beltSize()
				+ " belts.");

	}
	public int beltSize() {
		return beltSize;
	}

	private Elvis() {
		beltSize = CURRENT_YEAR - 1930;
	}
}

第一眼看去,这个程序是在计算当前的年份减去1930的值。但运行程序结果为:Elvis wears a size -1930 belts.
这个问题是由类初始化顺序中的循环而引起的。Elvis类的初始化是由虚拟机对其main方法的调用而触发的。首先,其静态域被设置为缺省值,INSTANCE为null,CURRENT_YEAR为0。接下来,静态域初始器按照其出现的次序执行。第一个静态域INSTANCE,它的值通过调用构造器而计算出的。这个构造器用一个涉及了静态域CURRENT_YEAR的表达式来计算的,而此时其值仍然是0。所以beltSize为-1930。
谜题50:不是你的类型
本谜题测试你对java的两个经典操作符:instanceof和转型的理解程度。
public class Type1 {
	public static void main(String[] args) {
		String s = null;
		System.out.println(s instanceof String); //false
	}
}

public class Type2 {
	public static void main(String[] args) {
		System.out.println(new Type2() instanceof String); 
	}
}

public class Type3 {
	public static void main(String[] args) {
		Type3 t = (Type3) new Object();
	}
}

第一个输出false,因为尽管null对于每一个引用类型来说都是其子类型, 但是instanceof操作符被定义为在其做操作数为null时返回false
第二个程序编译失败,原因是: instanceof操作符有这样的要求,如果两个操作数的类型是类,其中一个必须是另外一个的子类型
第三个抛出 java.lang.ClassCastException异常
谜题54:null与void下面是经典hello world的变种,将打印什么呢?
public class Null {
	public static void greet(){
		System.out.println("hello world");
	}
	public static void main(String[] args) {
		((Null)null).greet();
	}
}

这个程序似乎应该抛出NullPointerException异常,但它打印出了“hello world”。
理解本谜题的关键是,Null.greet是一个静态方法。等价于greet()和Null.greet().
如果将方法的static去掉,就会出现异常。
谜题55:特创论
class Creature {
	private static long numCreated = 0;

	public Creature() {
		numCreated++;
	}
	public static long numCreated() {
		return numCreated;
	}
}
public class Creator {

	public static void main(String[] args) {

		for(int i = 0;i<100;i++)
			Creature creature = new Creature();
			System.out.println(Creature.numCreated());
	}
}

这是一个作弄人的问题,看似打印100,但是它根本不能编译。java语言规范不允许一个本地变了声明语句作为一条语句在for、while、do循环中重复执行。 一个本地变量声明作为一条语句只能直接出现在一个语句块中

你可能感兴趣的:(java,虚拟机)