java面试题17--类的加载、对象的加载流程

来源:互联网 发布:ubuntu pycharm pyqt5 编辑:程序博客网 时间:2024/05/06 17:21


要知道该代码的执行顺序,首先明确:
  1.静态代码顺序执行,请牢记!!!
  2.静态代码块 -> 构造代码块 -> 构造方法

public class JDtest1 {    public static JDtest1 t1 = new JDtest1(); //静态成员变量     {        System.out.println("blockA"); //构造代码块    }    static{        System.out.println("blockB"); //静态代码块    }    public static void main(String[] args) {        JDtest1 t2 = new JDtest1();     }}


1.在该代码中,加载类JDtest1时,首先执行的第一行代码,定义静态成员变量 t1,(静态成员是类所有的对象的共享的成员,而不是某个对象的成员。)
2.定义的t1的同时,又new了一个新的对象出来,这个对象是本类对象,new的过程中,首先要执行构造代码块,即输出了“blockA”
3.接着,执行下一行static代码块,输出“blockB”,至此,类加载完成
4.执行main方法,同样,new了一个JDtest1对象,接下来要执行的是构造代码块,输出“blockA”

因此,最终输出:
blockA
blockB
blockA

例题2:

public class StaticVariableTest1 {    private static StaticVariableTest1 obj = new StaticVariableTest1();    private static int counter1;    private static int counter2 = 0;    private StaticVariableTest1(){        counter1++;        counter2++;    }    public static StaticVariableTest1 getInstance(){        return obj;    }    /**     * @param args     */    public static void main(String[] args) {        StaticVariableTest1 obj = StaticVariableTest1.getInstance();        System.out.println("obj.counter1=="+obj.counter1);        System.out.println("obj.counter2=="+obj.counter2);    }}


结果:
obj.counter1==1
obj.counter2==0

执行过程详解:
从main函数开始
1 类加载的过程:
 1.1 先执行第一句static代码,new对象的时候,调用了构造方法
构造方法执行完毕之后,counter1==1,counter2==2
 1.2 接着执行第3句,赋值语句,将counter2赋值为0
2 获取实例过程
 通过getInstance的return ,返回一个在静态加载时已经创建的实例
3 打印
 打印counter1  --1
 打印counter2  --0

0 0
原创粉丝点击