疯狂Java讲义_03_初始化块

初始化块

初始化块与成员变量的执行顺序:

public class helloworld
{
	//初始化块
	{
		a=6;
	}

	//成员变量
	private int a=9;

	public static void main(String[] args)
	{
		System.out.println(new helloworld().a);//9
	}
}
public class helloworld
{

	//成员变量
	private int a=9;
	
	//初始化块
	{
		a=6;
	}

	public static void main(String[] args)
	{
		System.out.println(new helloworld().a);//6
	}
}

当Java创建一个对象时,系统先为该对象的所有实例 Field分配内存(前提是该类已经被加载过了),接着程序开始对这些实例变量执行初始化,其初始化顺序是:先执行初始化块或声明 Field时指定的初始值(看两者的顺序),再执行构遗器里指定的初始值。

从某种程度上说,初始化块是构造器的补充。初始化块总是在构造器执行之前执行。

静态初始化块

初始化块用static修饰后就是静态初始化块了,并且只能被static修饰。

静态初始化块也被称为类初始化块,也属于类的静态成员,同样需要遵循静态成员不能访问非静态成员的规则,因此静态初始化块不能访问非静态成员,包括不能访问实例Field和实例方法。

静态初始化块与静态成员变量的初始化(同样也是看谁在前谁在后):

public class Helloworld
{
	//初始化块
	static {
		a=6;
	}
	//成员变量
	private static int a=9;

	public static void main(String[] args)
	{
		System.out.println(Helloworld.a);//9
	}
}
public class Helloworld
{
	//成员变量
	private static int a=9;	
	//初始化块
	static {
		a=6;
	}

	public static void main(String[] args)
	{	
		System.out.println(Helloworld.a);//6
	}
}

初始化块、静态初始化块、构造器 执行顺序

静态初始化块:用来对类进行初始化(又称为类初始化)

初始化块:用来对对象进行初始化

构造器:创建一个对象时,调用的方法。可以进行初始化,默认有一个无参数构造器,但一旦自己写了有参数构造器后,系统就不会再提供默认的无参数构造器了。

先 静态初始化块 (并且只执行一次)当第一次使用到该类时,JVM加载该类,进行类初始化,一旦加载成功就永在JVM内存中,直到JVM退出。
再 初始化块
再 构造器

另外:初始化某个类时,总是先初始化该类的所有父类(包括直接父类和间接父类)。

public class ConversionTest
{
    public static void main(String [] args)
    {
        new Leaf();
        new Leaf();
    }
}
/* 结果:
Root 静态初始化块
Mid 静态初始化块
Leaf 静态初始化块
Root 普通初始化块
Root 构造器
Mid 普通初始化块
Mid 构造器
Leaf 普通初始化块
Leaf 构造器
Root 普通初始化块
Root 构造器
Mid 普通初始化块
Mid 构造器
Leaf 普通初始化块
Leaf 构造器
*/

class Root
{
    //静态初始化块
    static{ System.out.println("Root 静态初始化块"); }
    //初始化块
    { System.out.println("Root 普通初始化块"); }
    //构造器
    public Root(){ System.out.println("Root 构造器"); }
}
class Mid extends Root
{
    //静态初始化块
    static{ System.out.println("Mid 静态初始化块"); }
    //初始化块
    { System.out.println("Mid 普通初始化块"); }
    //构造器
    public Mid(){ System.out.println("Mid 构造器"); }
}
class Leaf extends Mid
{
    //静态初始化块
    static{ System.out.println("Leaf 静态初始化块"); }
    //初始化块
    { System.out.println("Leaf 普通初始化块"); }
    //构造器
    public Leaf(){ System.out.println("Leaf 构造器"); }    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值