关于java类初始化顺序的学习笔记

本文详细解析了Java类的初始化顺序,包括静态变量、静态初始化块、普通变量、初始化块以及构造器之间的执行顺序。通过具体代码示例,展示了静态变量和静态初始化块、普通变量和初始化块在类实例化过程中的初始化顺序,并解释了继承类的初始化顺序特点。同时,文章解答了静态变量和静态初始化块是否仅初始化一次的问题。
摘要由CSDN通过智能技术生成
</pre>1)类的初始化顺序:(静态变量,静态初始化块)>(变量,初始化块)>构造器<pre name="code" class="java">
public class InitClass {
 // 构造器   
    public InitClass() {   
        System.out.println("构造器");   
    }   
  
    // 变量   
    public String  variable = "变量";   
  
    // 静态变量   
    public static String staticVariable = "静态变量";   
    // 初始化块   
    {   
       // System.out.println(staticVariable);// 此处可以引用静态变量也说明了静态变量在初始化代码块着被初始化
        System.out.println(variable); 
        System.out.println("初始化块");   
         
    }   
    // 静态初始化块   
    static {   
       // System.out.println(variable);//此处引用非静态变量报错,自己理解是因为静态块是在变量前被初始化的,所以静态块中引用变量时,此变量还不存在故报错
        System.out.println(staticVariable);   
        System.out.println("静态初始化块");   
    }   
  
    public static void main(String[] args) {   
        new InitClass();   
}
}

此代码运行结果为:

静态变量
静态初始化块
变量
初始化块
构造器

2)存在继承的类的初始化顺序为:(父类静态变量,父类静态初始化块)>(子类静态变量,子类静态初始化块)>(父类变量,父类初始化块)>父类构造器>(子类变量,子类初始化块)>子类构造器

public class InitFather {

    // 构造器   
       public InitFather() {   
           System.out.println("父类构造器");   
       }   
     
       // 变量   
       public String  variable = "父类变量";   
     
       // 静态变量   
       public static String staticVariable = "父类静态变量";   
       // 初始化块   
       {   
           System.out.println(variable); 
           System.out.println("父类初始化块");   
            
       }   
       // 静态初始化块   
       static {   
           System.out.println(staticVariable);   
           System.out.println("父类静态初始化块");   
       }   
}




public class InitClass extends InitFather{
 // 构造器   
    public InitClass() {   
        System.out.println("子类构造器");   
    }   
  
    // 变量   
    public String  variable = "子类变量";   
  
    // 静态变量   
    public static String staticVariable = "子类静态变量";   
    // 初始化块   
    {   
       // System.out.println(staticVariable);// 此处可以引用静态变量也说明了静态变量在初始化代码块着被初始化
        System.out.println(variable); 
        System.out.println("子类初始化块");   
         
    }   
    // 静态初始化块   
    static {   
       // System.out.println(variable);//此处引用非静态变量报错,自己理解是因为静态块是在变量前被初始化的,所以静态块中引用变量时,此变量还不存在故报错
        System.out.println(staticVariable);   
        System.out.println("子类静态初始化块");   
    }   
  
    public static void main(String[] args) {   
        new InitClass();   
}
} 

此代码运行结果为:

父类静态变量
父类静态初始化块
子类静态变量
子类静态初始化块
父类变量
父类初始化块
父类构造器
子类变量
子类初始化块
子类构造器

3)最后,变量一定是在初始化块前初始化吗?静态变量一定是在静态初始化块着初始化吗?

答案是否定的,这取决于静态变量和静态初始化块、变量和初始化块在代码中出现有位置。

4)静态变量及静态初始化块只会被初始化一次

public class InitClass{
 // 构造器   
    public InitClass() {   
        System.out.println("子类构造器");   
    }   
  
    // 变量   
    public String  variable = "子类变量";   
  
    // 初始化块   
    {   
       // System.out.println(staticVariable);// 此处可以引用静态变量也说明了静态变量在初始化代码块着被初始化
        System.out.println(variable); 
        System.out.println("子类初始化块");   
         
    }   

    // 静态变量   
    public static String staticVariable = "子类静态变量";   
   
    // 静态初始化块   
    static {   
       // System.out.println(variable);//此处引用非静态变量报错,自己理解是因为静态块是在变量前被初始化的,所以静态块中引用变量时,此变量还不存在故报错
        System.out.println(staticVariable);   
        System.out.println("子类静态初始化块");   
    }   
    public static void main(String[] args) {   
        new InitClass();   
        new InitClass();   
}
}
运行结果如下:
子类静态变量
子类静态初始化块
子类变量
子类初始化块
子类构造器
子类变量
子类初始化块
子类构造器





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值