类实例初始化时代码块和静态代码块的使用

本文介绍了Java中构造方法之前运行的普通代码块与仅在类加载时运行一次的静态代码块的区别。普通代码块随实例创建而运行,而静态代码块只运行一次,且在父类静态代码块之后运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一 普通的代码块

就是我们说说的代码块,它无论定义在构造方法的哪个地方(或前或后),总是在构造方法之前运行,每定义一个实例对象,就会运行一次。如果父类中也有代码块则运行顺序如下:

1 父类普通代码块

2 父类构造方法

3 子类普通代码块

4 子类构造方法

例如:

public class CodeBlockTest {
    public static void main(String[] args) throws Exception{
       new Child();
System.out.println("刚刚创建了一个实例");
       new Child();
System.out.println("刚刚创建了一个实例");
    }
}
 
class Parent{
    public Parent() {
       System.out.println("父类构造方法");
    }
    {
       System.out.println("父类普通代码块1");
    }
    {
       System.out.println("父类普通代码块2");
    }
}
 
class Child extends Parent{
    public Child() {
       System.out.println("子类构造方法");
    }
    {
       System.out.println("子类普通代码块");
    }
}

 

第二 静态代码块

静态代码块只在类加载的时候才会运行一次,之后使用该类时不会在运行。因为是先加载类才能创建实例的,所以当第一次使用类创建实例时,会先运行静态代码块。如果该类的父类中有静态代码块,则会先运行父类的静态代码块。如果之前已经加载了子类,则再加载父类时不再单独运行父类中的静态代码块。记住,静态代码块只运行一次。如下:

public class CodeBlockTest {
	public static void main(String[] args) throws Exception{
		System.out.println("*****加载子类*****");
		Class.forName("test2.Child");
		System.out.println("*****加载子类*****");
		Class.forName("test2.Child");
		System.out.println("*****加载父类*****");
		Class.forName("test2.Parent");
		System.out.println("*****加载父类*****");
		Class.forName("test2.Parent");
	}
}

class Parent{
	private int a;
	private static int b;
	static{
//		这是错误的,静态代码块中不能出现非静态的属性和方法
//		a = 1;
		
		//这是错误的,静态代码块中不能出现this和super等关键字
//		this.b = 10;
		
		//这是正确的
		b = 10;
		System.out.println("父类静态代码块1");
	}
	public Parent() {
		System.out.println("父类构造方法");
	}
	static{
		System.out.println("父类静态代码块2");
	}
}

class Child extends Parent{
	static{
		System.out.println("子类静态代码块");
	}
	public Child() {
		System.out.println("子类构造方法");
	}
}

 运行结果是:

*****加载子类*****

父类静态代码块1

父类静态代码块2

子类静态代码块

*****加载子类*****

*****加载父类*****

*****加载父类*****

 

注意:静态代码块中不能出现非静态的属性和方法,也不能出现thissuper等关键字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值