Java --- 类加载与类初始化

类加载

1,在jvm生命周期中每个类如果存在,则不会重复加载。
2,定义了main的类,启动main方法时该类会被加载
3,在加载子类的时候会优先加载其父类。
4,类被加载的时候,其中的静态代码块、静态方法及静态变量也会被加载。
5,在初始化某个类时,如果这个类的静态代码块、静态方法或静态变量引用到了另一个类,则这个类也会被加载。

类初始化

1,类初始化在类加载后进行,即如果new 一个子类,顺序为:父类加载,子类加载,父类初始化,子类初始化
2,在父子类中,执行顺序是:
爷爷类的静态初始化块|静态属性初始化>
父类静态初始化块|静态属性初始化>
子类静态初始化块|静态属性初始化>
爷爷类普通初始化块|普通属性初始化>构造器>
父类普通初始化块|普通属性初始化>构造器>
子类普通初始化块|普通属性初始化>构造器
同级初始化由定义顺序依次初始化
3,静态代码块与静态方法一样,只能访问静态成员(类加载的时候还没有类实例,很明显啦)
4,静态初始化块只调用一次(类加载时),而普通初始化块可以调用多次,随着对象的创建而加载,普通初始化块:创建对象时隐式调用,静态初始化块:类加载时隐式调用。

静态初始化块:类加载时隐式调用

public class TestInit5 {
	public static void main(String[] args) {
		InitDemo5 id = new InitDemo5();
	}
}
 
class Grand {
	public Grand() {
		System.out.println("我是爷爷类的构造器");
	}
 
	String a = fun("爷爷类的普通属性初始化");
 
	public static String fun(String info) {
		System.out.println(info);
		return info;
	}
 
	static {
		System.out.println("爷爷类的静态代码块");
	}
	{
		System.out.println("爷爷类的普通代码块");
	}
	static String d = fun("爷爷类的静态属性初始化");
}
 
class Father extends Grand {
	public Father() {
		System.out.println("我是爷爷类的构造器");
		System.out.println("我是父类的构造器");
	}
 
	String a = method("父类的普通属性初始化");
 
	public static String method(String info) {
		System.out.println(info);
		return info;
	}
 
	static {
		System.out.println("父类的静态代码块");
	}
	{
		System.out.println("父类的普通代码块");
	}
	static String d = method("父类的静态属性初始化");
}
 
class InitDemo5 extends Father {
	public InitDemo5() {
		System.out.println("我是子类的构造器");
	}
 
	String a = msg("子类的普通属性初始化");
 
	public static String msg(String info) {
		System.out.println(info);
		return info;
	}
 
	static {
		System.out.println("子类的静态代码块");
	}
	{
		System.out.println("子类的普通代码块");
	}
	static String d = msg("子类的静态属性初始化");
}

在这里插入图片描述

5,如果在静态代码块里调用本类的构造方法,构造方法即会在静态代码块结束前完成

public class test {
    private static int a;
    private int b;
    static {
            test.a = 3;
            System.out.println(a);
            test t = new test();
            t.f();
            t.b = 1000;
            System.out.println(t.b);
    }
    test(){
    	System.out.println("这是一个构造方法");
    }
    static {
            test.a = 4;
            System.out.println(a);
    }
    public static void main(String[] args) {
            // TODO 自动生成方法存根
    }
    static {
            test.a = 5;
            System.out.println(a);
    }
    public void f() {
            System.out.println("这是一个方法");
    }
}
3
这是一个构造方法
这是一个方法
1000
4
5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值