JAVA初始化及类的加载

在许多传统语言中,程序是作为启动过程的一部分被加载的。然后是初始化,紧接着程序开始运行。这些语言的初始化过程必须小心控制,以确保定义为static的东西,其初始化顺序不会造成麻烦。例如C++期望一个static在另一个static在被初始化之前就能有效的使用它,那么就会出现问题。

java不会出现这种问题,java采用了一种不同的加载方式。每个类的编译代码只有在初次使用时才加载。这通常是指加载发生在创建类的第一个对象之时但是当访问static域或static方法时,也会发生加载

初次使用之处也是static初始化发生之处。所有static对象和static代码段都会在加载时依程序中的顺序【定义类的书写顺序】而一次初始化。当然,定义为static的东西只会被初始化一次。

注意点:

构造器也是static方法,尽管static关键字并没有显式的写出来。因此更准确的讲类是在其任何static成员被访问时加载的

复制代码
public class Insect {
    private int i=9;
    protected int j;
    Insect(){
        System.out.println("i="+i+",j="+j);
        j=39;
    }
    private static  int x1=printInit("static Insect.x1 initialized");
    static int printInit(String s){
        System.out.println(s);
        return 47;
    }
}
View Code
复制代码
复制代码
public class Bettle extends  Insect{
    private int k=printInit("Beetle.k init");
    public Bettle(){
        System.out.println("k="+k);
        System.out.println("j="+j);
    }
    private static int x2=printInit("static Beetle.x2 init");

    public static void main(String[] args) {
        System.out.println("Bettle constructor");
//        Bettle bettle=new Bettle();
    }
}
View Code
复制代码
1
2
3
4
5
6
7
output:static Insect.x1 initialized
static Beetle.x2 init
Bettle constructor
i=9,j=0
Beetle.k init
k=47
j=39

  1.基类的static代码段会优先与派生类的static初始化

       2.基类的构造优先发生于派生类的构造器:其实本质也是一个static方法

posted @   陶朱公Boy  阅读(333)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示