类加载
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