java类与类的继承中,单例情况下,类的静态代码块,代码块,构造方法 执行情况总结

本文详细解析了Java中类的加载与初始化过程,包括静态代码块、普通代码块及构造方法的执行顺序,探讨了单例模式下类的加载特性,特别是不懒式和懒汉式单例的区别。

单一类情况

父类A的代码情况:

    public class A {

	public static String a1="测试数据A";
	
	static {
		System.out.println("这是A的静态代码块");
	}
	
	{
		System.out.println("这是A的普通代码块");
	}
	
	public  static void fun1() {
		System.out.println("这是一个A的静态函数");
	}
}

在test类里进行测试

System.out.println(A.a1);

结果为:

这是A的静态代码块
测试数据A

类B继承A后情况

类B代码:

public  class B extends A{

	public static String a1="测试数据B";
	public B() {
		System.out.println("这是构造方法!");
	}

	{
		System.out.println("这是普通代码块");
	}
	
	static {
		System.out.println("这是静态代码块");
	}

	public  static void fun2() {
		System.out.println("这是一个静态函数");
	}
	
}

测试方法1:

	    B.fun1();//直接调用A的静态方法

结果为:

这是A的静态代码块
这是一个A的静态函数

测试方法2:

  B.fun2();//直接调用B的静态方法 

结果为:

这是A的静态代码块
这是B的静态代码块
这是一个B的静态函数

测试方法3:

new B();//new 一个B

结果为:

这是A的静态代码块
这是B的静态代码块
这是A的普通代码块
这是B的普通代码块
这是B的构造方法!

单例模式状态下

1.不懒的时候

public class B {

	private static B b = new B();
	public static String a1 = "测试数据B";
	private B() {
		System.out.println("这是B的构造方法!");
	}
	{
		System.out.println("这是B的普通代码块");
	}
	static {
		System.out.println("这是B的静态代码块");
	}
	public static B getInstance() {
		System.out.println("这是一个B的静态函数");
		return b;
	}
}

结果为:

这是B的普通代码块
这是B的构造方法!
这是B的静态代码块
这是一个B的静态函数

2.懒汉式

    public class B {
	private static B b = null;
	public static String a1 = "测试数据B";
	public B(int a) {
	}
	private B() {
		System.out.println("这是B的构造方法!");
	}
	{
		System.out.println("这是B的普通代码块");
	}
	static {
		System.out.println("这是B的静态代码块");
	}
	public static B getInstance() {
		System.out.println("这是一个B的静态函数");
		if(b==null)
			b= new B();
		return b;
	}
}

结果为:

B b =B.getInstance();//测试代码
B b1=new B(1);//测试代码

这是B的静态代码块
这是一个B的静态函数
这是B的普通代码块
这是B的构造方法!

这是B的普通代码块

总结:

1.所有有继承关系的类从顶层开始先执行 静态代码块 然后执行到底层类,然后是 普通代码块,最后才是构造方法。

2.静态代码块只允许一次,普通代码块可以运行多次

3.静态代码块只要是关于此类的一切方法、构造函数、静态常量、静态方法等,就会运行

4.普通代码块是构造函数时才会运行

5.以上是说明不符合不懒的单例模式

6.不懒的单例模式会先创建实例,然后创建实例时,实例的创建优先于静态代码块,而静态代码块是第一次运行,此时创建实例相当于第二次调用此类,故此时静态代码块在构造函数后运行。

7.如果有问题希望您可以指出,感激不尽!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值