静态代码块,构造代码块,构造方法的加载执行顺序研究

来源:互联网 发布:互联网大数据查询 编辑:程序博客网 时间:2024/04/25 09:06

构造代码块是给所有的对象进行初始化,也就是说,所有的对象都会调用同一个代码块。只要对象一创立,就会调用这个代码块。


package com.inphase.construct;


public class Demo {
    private static int a = 0;
    
    /*
     * 静态代码块随着类被jvm虚拟机加载而加载
     */
    static{   
        a = 10 ;
        System.out.println("静态代码块在执行a="+a);
    }
    
    /**
     * 非静态代码块, 需要创建对象才会随之加载到堆内存
     */
    {
        a = 8;
        System.out.println("非静态代码块(构造代码块)在执行a=" + a);
    }
    /*
     * 空参数构造
     */
     public Demo() {
            this("调用带参构造方法1,a=" + a);
            System.out.println("无参构造方法在执行a=" + a);
        }
     /**
      * 有参构造
      * @param n
      */
     public Demo(String n) {
            this(n, "调用带参构造方法2,a=" + a);
            System.out.println("带参构造方法1在执行a=" + a);
        }
         /**
          * 有参数构造
          * @param s1
          * @param s2
          */
        public Demo(String s1, String s2) {
            System.out.println(s1 + ";" + s2);
        }
        
        public static void main(String[] args) {
            Demo demo = null;   //JVM加载类进入java虚拟机
            System.out.println("下面new一个Test实例:");
            demo = new Demo();
        }

}


执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步
1,super语句,可能出现以下三种情况:
1)构造方法体的第一行是this语句,则不会执行隐式三步,
2)构造方法体的第一行是super语句,则调用相应的父类的构造方法,
3)构造方法体的第一行既不是this语句也不是super语句,则隐式调用super(),即其父类的默认构造方法,这也是为什么一个父类通常要提供默认构造方法的原因;
2,初始化非静态变量
3,构造代码块
由此可知,构造代码块优先于构造方法的方法体,但是this关键字跟super关键字不能同时出现,而且只能在代码的第一行。如果出现了this关键字,隐式三步就不会执行。

当递归调用多个构造方法的时候,构造代码块只会在最后的(也即方法体第一行不是this语句的)那个构造方法执行之前执行!


阅读全文
0 0
原创粉丝点击