欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

类加载程序分析题

程序员文章站 2022-10-03 16:19:12
类加载程序分析题请写出以上代码的执行结果:所需知识点父类优于子类(儿子肯定干不过爸爸)静态优于非静态:静态中(静态变量、静态代码块、静态方法【不运行只加载】):根据你编码顺序,从上至下运行非静态(非静态常量、普通代码块、构造器):非静态变量和普通代码块,优于构造器PS1:构造器最后执行非静态变量和普通代码块按照编码顺序执行。PS2:父类的静态属性加载完会加载子类的静态属性子父静态加载完——>加载父类解题思路:先找主方法main public static vo...

类加载程序分析题

类加载程序分析题

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

所需知识点

  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

相关标签: 笔记