public class Test3
{
public static void main(String[] args)
{
System.out.println(FinalTest2.x);
}
}
</code>
Output: 5(一个随机数)
这两段程序中的FinalTest2一个初始化了,一个没有,这是为什么呢?6/3是一个编译常量,在编译的时候就已经确定值了。这是不会导致类的初始化,前一段程序,public static final int x = new Random().nextInt(100);并不能在编译的时候就赋初值,类只有在加载的时候才能赋予初值。
可以在函数块或者构造函数中去初始化,因为我们要生成一个对象那么函数块和构造方法是必须的。而且初始化只能而这选一,不然会出现The final field i may already have been assigned。
如果要在构造方法冲去初始化final变量,那么每一个构造方法都必须有初始化操作。
当然最直接的办法就是直接在变量申明后面赋值。
Static final 变量的初始化,只能是直接赋值,或者是在静态代码块中赋予初值。
对于Interface,我们知道interface中是可以有变量的,但是它里面的变量默认是public static final的,而interface中是不能有代码块或者静态代码块,所以这时候我们定义接口时,如果里面有成员变量,那么只能是直接赋值。
<code>
interface A {
int a = 9;//( 前面的修饰符only public, static & final are permitted,不写的话默认就是这些合起来)
}
</code>
其实通过编译器报的这句错误The interface A cannot define an initializer,我们可以发现代码块或者静态代码块的作用就是拿来初始化变量的,initializer。
</code>
<code>
public class Dog {
public Dog() {
System.out.println("Dog is loaded by:" + this.getClass().getClassLoader());
}
}
</code>
<code>
public class Sample {
public int v1 = 1;
public Sample() {
System.out.println("Sample is loaded by:" + this.getClass().getClassLoader());
new Dog();
}
}