看下面一段代码:1
2
3
4
5
6
7
8
9
10
11
12public class Test1 {
public static void main(String args[]){
System.out.println(FinalTest.x);
}
}
class FinalTest{
public static final int x =6/3;
static {
System.out.println("FinalTest static block");
}
}
上面和下面的例子大家对比下,然后自己看看输出的是什么?
1 | public class Test2 { |
实际测试的结果是:
第一个输出的是1
2
第二个输出的是1
2FinalTest2 static block
61(随机数)
为何会出现这样的结果呢?
参考上面的Tips2和Tips3,第一个能够在编译时期确定的,叫做编译常量;第二个是运行时才能确定下来的,叫做运行时常量。编译常量不会引起类的初始化,而运行常量就会。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class Singleton {
private static Singleton singleton = new Singleton();
public static int counter1;
public static int counter2 = 0;
private Singleton() {
counter1++;
counter2++;
}
public static Singleton getSingleton() {
return singleton;
}
}
下面是我们的测试类TestSingleton1
2
3
4
5
6
7public class TestSingleton {
public static void main(String args[]){
Singleton singleton = Singleton.getSingleton();
System.out.println("counter1="+singleton.counter1);
System.out.println("counter2="+singleton.counter2);
}
}
输出是:1
2
3counter1=1
counter2=0