当前位置: 移动技术网 > IT编程>开发语言>Java > 类加载程序分析题

类加载程序分析题

2020年07月31日  | 移动技术网IT编程  | 我要评论

类加载程序分析题

在这里插入图片描述

请写出以上代码的执行结果:

所需知识点

  1. 父类优于子类(儿子肯定干不过爸爸)
  2. 静态优于非静态:

静态中(静态变量、静态代码块、静态方法【不运行只加载】):

根据你编码顺序,从上至下运行

非静态(非静态常量、普通代码块、构造器):

非静态变量和普通代码块,优于构造器

PS1:

构造器最后执行非静态变量和普通代码块按照编码顺序执行。

PS2:

父类的静态属性加载完会加载子类的静态属性
子父静态加载完——>加载父类

解题思路:

  1. 先找主方法main
 public static void main(String[] args) {
        System.out.println("1");//输出1;
        new D();
    }

运行输出1

  1. 其中D为C的子类,C为B的子类,所以C的优先级高于D,B的优先级高于C
class D extends C
class C extends B
  1. 故先执行B,其中静态优于非静态故先执行static静态属性
class B {
    E e = new E();
    static F f = new F();//先执行等号右边,创建一个F类,构造器执行输出4
    public String sb = getSb();

    static {
        System.out.println("6");//然后执行输出6
        f.funcOff();//F类中funcoff构造方法输出5
    }
        {
            System.out.println("7");
        }
        B() {
            System.out.println("8");
            e.funcOff();
        }
        public String getSb() {
            System.out.println("9");
            return "sb";
        }
    }
  1. B的静态执行完,接着执行C当中的静态
   class C extends B {    
       static {System.out.println("10");} //输出10
              {System.out.println("11");}   
         C()  {System.out.println("12");}
   }
  1. C的静态执行完,最后执行D的静态
class D extends C {
    public String sd1 = getSd1();
    public static String sd = getSd();//等号右边先执行,getSd()当中的值返回给sd,输出16

    static {System.out.println("13");}//输出13
           {System.out.println("14");}

    D() {System.out.println("15");}

    static public String getSd() {
        System.out.println("16");
        return "sd";
        }

    public String  getSd1(){
        System.out.println("17");
        return "sd1";}
}

父类的静态属性加载完会加载子类的静态属性
子父静态加载完——>加载父类

  1. 加载B
class B {
    E e = new E();//E类中E构造器执行输出2
    static F f = new F();////静态已执行
    public String sb = getSb();//getsb()构造器输出9
static {
    System.out.println("6");
    f.funcOff();
}//静态已执行
    {
        System.out.println("7");
    }//输出7
    B() {
        System.out.println("8");//输出8
        e.funcOff();//E类中,funcOff()构造器执行输出3
    }
    public String getSb() {
        System.out.println("9");
        return "sb";
    }
}
  1. 加载C
class C extends B {
    static {
        System.out.println("10");
    }////静态已执行

    {
        System.out.println("11");
    }//输出11

    C() {
        System.out.println("12");
    }//输出12
}

7.加载D

class D extends C {
    public String sd1 = getSd1();//gerSd1()构造器输出17
    public static String sd = getSd();//静态已执行

    static {System.out.println("13");}//静态已执行

    {System.out.println("14");}//输出14

    D() {System.out.println("15")}

    static public String getSd() {
        System.out.println("16");
        return "sd";
}//静态已执行

    public String  getSd1(){
        System.out.println("17");
        return "sd1";
    }
}
  1. 最后执行main方法
 public static void main(String[] args) {
        System.out.println("1");//已经执行
        new D();//输出D类中D()构造器执行输出15
    }

最后结果1 4 6 5 10 16 13 2 9 7 8 3 11 12 17 14 15

本文地址:https://blog.csdn.net/qq_42455310/article/details/107691012

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网