在看thinking in java的类型信息这一章,碰到这样一个程序,有些不明白,望高手解答:
程序如下: import java.util.* ;class Initable {
static final int staticFinal = 47 ;
static final int staticFinal2 =
ClassInitialization.rand.nextInt(1000) ;
static {
System.out.println("Initializing Initable ");
}
}
class Initable2 {
static int staticNonFinal = 147 ;
static {
System.out.println("Initializing Initable2");
}
}
public class ClassInitialization {
public static Random rand = new Random(47) ;
public static void main(String[] args) throws Exception {
Class initable = Initable.class ;
System.out.println("After creating Initable ref");
System.out.println(Initable.staticFinal);
System.out.println(Initable.staticFinal2);
System.out.println(Initable2.staticNonFinal);
}
}
为什么运行结果是:
After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
为什么在打印System.out.println(Initable.staticFinal2);前要先把Initable类初始化,
书上说调用static final(即编译期常量)时不需先初始化该类啊,
如果把static final int staticFinal2 = ClassInitialization.rand.nextInt(1000) ;
改成static final int staticFinal2 = 20;则Initializing Initable 不会打印,也就是不会初始化Initable类,这是为什么呢?
程序如下: import java.util.* ;class Initable {
static final int staticFinal = 47 ;
static final int staticFinal2 =
ClassInitialization.rand.nextInt(1000) ;
static {
System.out.println("Initializing Initable ");
}
}
class Initable2 {
static int staticNonFinal = 147 ;
static {
System.out.println("Initializing Initable2");
}
}
public class ClassInitialization {
public static Random rand = new Random(47) ;
public static void main(String[] args) throws Exception {
Class initable = Initable.class ;
System.out.println("After creating Initable ref");
System.out.println(Initable.staticFinal);
System.out.println(Initable.staticFinal2);
System.out.println(Initable2.staticNonFinal);
}
}
为什么运行结果是:
After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
为什么在打印System.out.println(Initable.staticFinal2);前要先把Initable类初始化,
书上说调用static final(即编译期常量)时不需先初始化该类啊,
如果把static final int staticFinal2 = ClassInitialization.rand.nextInt(1000) ;
改成static final int staticFinal2 = 20;则Initializing Initable 不会打印,也就是不会初始化Initable类,这是为什么呢?
static final int staticFinal2 =
ClassInitialization.rand.nextInt(1000) ; 因为这不是编译时常量,在编译的时候怎么能知道 ClassInitialization.rand.nextInt(1000) 是多少呢。。 你改成20那就是编译时常量了。
你代码中没有初始化吧,注意看清楚哦。
应为是static修饰的,在Initable.的时候这个类就加载到内存当中了,不应该叫初始化,然后static修饰的值都会在静态区中产生,而Initable.加载类的时候他会执行一下这个类中的静态块,所以System.out.println("Initializing Initable ");
System.out.println("Initializing Initable2 ");
静态块只会在类加载的时候执行一次就不会在执行了,所有你只能看到一次,不是说你改了就不会执行了。
Class initable = Initable.class ; 是一个类对象,而不是一个类的实例对象。
2.书上是说了静态的东西不需要实例化可以直接引用,但是你可以试一下,你创建了实例,这个实例也是可以调用静态的东西的。
3.你改成20和初始化类没什么关系,在你没注释Class initable = Initable.class ;这句语句的时候,依然会打印出"Initializing Initable ",当你没创建实例的时候,你的这个代码,只是进行了打印输出,并没有用到Initable和Initable2这两个类。
不知道LZ懂没、
static final,某个变量或方法不仅是静态的而且还是final,表示该变量或是方法不能被继承的。