Java初始化顺序

本文详细介绍了Java中变量初始化的顺序,包括方法内外的变量、静态数据及静态代码块的初始化流程,并通过具体示例展示了这些概念的实际应用。

Java类内部的变量初始化的顺序:
在类的内部,变量的定义的先后顺序决定了初始化的顺序。变量无论是定义在方法外部,或者方法定义中间,还是在类的尾部,都会在任何方法(包括构造方法)被调用之前进行初始化。
对于基本类型,变量首先会被自动初始化赋值,然后再将给定的值赋给变量。

int ii = 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 都会执行这一段代码。顺序也是按照定义变量顺序

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值