Java类内部的变量初始化的顺序:
在类的内部,变量的定义的先后顺序决定了初始化的顺序。变量无论是定义在方法外部,或者方法定义中间,还是在类的尾部,都会在任何方法(包括构造方法)被调用之前进行初始化。
对于基本类型,变量首先会被自动初始化赋值,然后再将给定的值赋给变量。
int i;
i = 10;
首先自动初始化 i = 0, 然后i= 10,无法阻止自动初始化的进行。
例如:
public class TestInit{
Apple a1 = new Apple(1);
public TestInit(){
System.out.println("We are in the TestInit");
Apple a2 = new Apple(2);
}
Apple a3 = new Apple(3);
void f(){
System.out.println("We are in the function f");
Apple a4 = new Apple(4);
}
}
class Apple{
public Apple(int i){
System.out.println("This is an apple"+i);
}
public static void main(String[] args){
TestInit t = new TestInit();
t.f();
}
}
这一段程序的输出结果:
This is an apple1
This is an apple3
We are in the TestInit
This is an apple2
We are in the function f
This is an apple4
可以看见 a1,a3都是定义在方法外,并且a3定义在方法定义之间。它们首先执行初始化。然后才是a2,a4这两个在方法内部,执行初始化。
静态数据的初始化:
静态数据是指被static修饰的数据,可以修饰某一变量或者代码段,静态数据或者类变量与它所在的类的任何对象都无关,可以通过类名调用。并且类对象或方法只有一份存储空间,无论创建多少包含静态变量的类的方法,该静态变量只会占用一份存储空间,所有的对象共享这一个变量。
静态对象的初始化只有在被使用的情况下才会被执行,在初始化过程中先执行静态对象的初始化,然后再进行非晶态对象的初始化,顺序和上文所述的初始化顺序相同。
(Thinking In Java中写静态初始化只有在必要时刻才会进行,不是很明白这句话的意义,非静态的对象应该也是只有在必要时才会执行初始化)。
public class TestInit{
public static void main(String[] args){
Fruit f = new Fruit(1);
}
}
class Apple{
public Apple(int i){
System.out.println("This is an apple"+i);
}
public void app(int i){
System.out.println("Function app:"+i);
}
}
class Fruit{
static Apple a1 = new Apple(1);
Apple a3 = new Apple(3);
public Fruit(int i){
System.out.println("Fruit"+i);
a2.app(1);
}
public void fru1(int i){
System.out.println("Function fru1:"+i);
}
static Apple a2 = new Apple(2);
}
代码执行结果是:
This is an apple1
This is an apple2
This is an apple3
Fruit1
Function app:1
静态代码块的初始化
Java允许将多个静态初始化的动作组织成一个代码块如下:
class Fruit{
static Apple aa;
static Apple ab;
static Apple ac;
static {
aa = new Apple(6);
ab = new Apple(7);
ac = new Apple(8);
}
}
当创建一个Fruit对象或者是通过Fruit类调用 aa | ab | ac 都会执行这一段代码。顺序也是按照定义变量顺序
本文详细介绍了Java中变量初始化的顺序,包括方法内外的变量、静态数据及静态代码块的初始化流程,并通过具体示例展示了这些概念的实际应用。
230

被折叠的 条评论
为什么被折叠?



