类加载顺序

来源:互联网 发布:同声传译软件 编辑:程序博客网 时间:2024/06/05 19:02

若不用new 则只加载静态修饰的内容

静态变量>静态块>mian

public class Father {    int i;    static int staticI;    static {System.out.println("Father 静态代码块1"+" (++staticI)="+(++staticI));}    {System.out.println("Father 非静态代码块1"+" i="+i+" (++staticI)="+(++staticI));}    public Father() {System.out.println("Father 构造器");}    {System.out.println("Father 非静态代码块2"+" i="+i+" (++staticI)="+(++staticI));}    static {System.out.println("Father 静态代码块2"+" (++staticI)="+(++staticI));}    public static void main(String[] args) {System.out.println("main 方法"+" (++staticI)="+(++staticI));}    {System.out.println("Father 非静态代码块3"+" i="+i+" (++staticI)="+(++staticI));}    static {System.out.println("Father 静态代码块3"+" (++staticI)="+(++staticI));}}

运行结果

Father 静态代码块1 (++staticI)=1Father 静态代码块2 (++staticI)=2Father 静态代码块3 (++staticI)=3main 方法 (++staticI)=4

静态内容>非静态变量>非静态块>构造器

将main也归纳到静态内容

将上面代码的main改造:

public static void main(String[] args) {    System.out.println("main 方法"+" (++staticI)="+(++staticI));    new Father();}

运行结果

Father 静态代码块1 (++staticI)=1Father 静态代码块2 (++staticI)=2Father 静态代码块3 (++staticI)=3main 方法 (++staticI)=4Father 非静态代码块1 i=0 (++staticI)=5Father 非静态代码块2 i=0 (++staticI)=6Father 非静态代码块3 i=0 (++staticI)=7Father 构造器

结论

  1. 加载的顺序从上至下
  2. 静态变量>静态块>main>非静态变量>非静态块>构造器

有子类又会咋么样呢?

既然上面已经证明了在遵循加载规则的情况下顺序为从上至下

那么就可以简化代码了

public class CopyOfFather {    int i;    static int staticI;    static {System.out.println("Father 静态代码块1"+" (++staticI)="+(++staticI));}    {System.out.println("Father 非静态代码块1"+" i="+i+" (++staticI)="+(++staticI));}    public CopyOfFather() {System.out.println("Father 构造器");}    public static void main(String[] args) {        System.out.println("main 方法");        System.out.println("(++CopyOfSon.staticI)="+(++CopyOfSon.staticI));    }}class CopyOfSon extends CopyOfFather {    int i;    static int staticI;    public CopyOfSon() {System.out.println("Son 构造器");}    static {System.out.println("Son 静态代码块1"+" (++staticI)="+(++staticI));}    {System.out.println("Son 非静态代码块1"+" i="+i+" (++staticI)="+(++staticI));}}

执行结果

Father 静态代码块1 (++staticI)=1main 方法Son 静态代码块1 (++staticI)=1(++CopyOfSon.staticI)=2

结论:父类静态内容>子类静态内容

new 子类会怎么样

改造main:

public static void main(String[] args) {    System.out.println("main 方法");    new CopyOfSon();}

运行结果

Father 静态代码块1 (++staticI)=1main 方法Son 静态代码块1 (++staticI)=1Father 非静态代码块1 i=0 (++staticI)=2Father 构造器Son 非静态代码块1 i=0 (++staticI)=2Son 构造器

结论

此处非静态内容不包括构造器

父类静态内容>子类静态内容>父类非静态内容>父类构造器>子类非静态内容>子类构造器

详细结论

父类静态变量>父类静态代码块>父类main>子类静态变量>子类静态代码块>父类非静态变量>父类非静态代码块>父类构造器>子类非静态变量>子类非静态代码块>子类构造器

请记住:

1.静态>非静态
2.变量>代码块: 先定义变量后在代码块使用
3.构造器在最后