JAVA静态代码块、构造代码块、构造方法的解读

1.什么是静态代码块

        静态代码块是定义一个类时,直接写在类的{}中,用static关键字进行修饰的用{}包括起来的一行或多行代码,其语法为:

//创建一个有静态代码块的类
public class TestStaticCoding {
    static {
        System.out.println("静态代码块");
    }
}

2.什么是构造代码块

        构造代码块是定义类时,直接写在类{}内,用{} 包括起来的一行或者多行代码,在语法上,和静态代码块的区别就是,这个{}括起来的代码块并没有被static修饰,语法如下:

//创建一个包含静态代码块和构造代码块的类
public class TestStaticCoding {
    static{//定义了类的静态代码块
        System.out.println("静态代码块");
    }
    
    {//定义了类的构造代码块
        System.out.println("构造代码块");
    }
}

3.什么是构造方法

        这个学过类与对象的应该知道,一个类的对象被实例化时,必须使用new 关键字调用这个类的构造方法,用来初始化该对象(加载、开辟堆内存、初始化成员值、将栈内存地址赋值给引用变量)。语法如下:

package com.study.staticcoding;

import com.lgx.jdbc.TestJdbc;
//创建一个含有静态代码块、构造代码块和自己的构造方法(非继承父类)的类
public class TestStaticCoding {
    static {//静态代码块定义
        System.out.println("静态代码块");
    }
    {//构造代码块的创建
        System.out.println("构造代码块");
    }
    public TestStaticCoding(){//类的构造方法定义
        super();//先调用父类的构造方法
        System.out.println("构造方法");//在实例化自己的对象的时候,要做的事
    }


}

4.静态代码块、构造代码块和构造方法的区别

        先说结论:顺序是先执行静态代码块(一个进程只执行一次),然后会执行构造代码块,最后执行构造方法。

        语法上的区别前面已经给出,下面给出在运行时的区别,因为静态代码块用static修饰,当一个类在程序中被加载时,就会为这个类的static成员开辟好内存空间并初试化,它就会随着类的加载而存在于堆内存之中了,对于静态代码块而言,代码存在于内存中(不是以方法的形式)就会被执行掉,所以类的静态代码块在一个程序中在类被加载时被执行,已知一个JVM进程一旦用到了一个类,这个类就会被加载,后面直到进程就不再需要加载,类在进程中只会被加载一次(我现在是这么理解的,至于有没有其他方法,我还不知道),因此静态代码块在进程中只会执行一次,即在类被加载时,如果加载类是通过new创建对象,那么静态代码块会最先被执行。

        而构造代码块是类的普通成员,理解为对象成员,只有当对象存在时才会被“调用“或者说执行,而构造方法则也是在new的时候执行。在初始化对象时,开辟了堆内存空间,这时候构造代码块最先存在了,就是说已经写好了这个成员,还没调用构造器呢它就已经初始化了,所以构造代码块在堆内存中就一下被执行了,然后再调用构造器,为类的其他普通成员初始化,开辟内存,于是构造方法最后被执行。

        不知道上面两句话表达清楚了没有,但是我自己仿佛是明白了,通过这一段时间的反复学习,发现学好java的关键是弄懂底层原理。

下面看最后的执行例子:

package com.study.staticcoding;

import com.lgx.jdbc.TestJdbc;
//创建一个含有静态代码块、构造代码块和自己的构造方法(非继承父类)的类
public class TestStaticCoding {
    static {//静态代码块定义
        System.out.println("静态代码块");
    }
    {//构造代码块的创建
        System.out.println("构造代码块");
    }
    public TestStaticCoding(){//类的构造方法定义
        super();//先调用父类的构造方法
        System.out.println("构造方法");//在实例化自己的对象的时候,要做的事
    }
     public static void main(String[] args) throws ClassNotFoundException {
        Class.forName("com.study.staticcoding.TestStaticCoding");//这个时候类被加载,静态代码块被执行一次,类再进程中被加载过了,以后不会再加载了

        new TestStaticCoding();//创建一个类的对象,这个时候类早已被加载了,只会先执行构造代码块,再执行构造方法
        new TestStaticCoding();
    }

}

        执行的结果:

类加载时,执行静态代码块,类的对象创建时 ,先执行构造代码块,再执行构造方法

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值