java中代码块使用

本文深入探讨了Java中的代码块,包括初始化块和作用域。详细解释了它们的工作原理,何时使用,以及如何在实际编程中有效地利用它们来优化初始化过程。

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

/**
 * 类的第四个成员-初始化块(或代码块) 
 * 1. 代码块如果有修饰的话,那么只能用static 
 * 2. 分类:
 *  非静态初始化块 
 * 1. 可以对类的属性(静态&非静态)进行初始化操作,也可调用本类声明的方法 
 * 2. 里面可以有输出语句 
 * 3. 一个类可以有多个初始化块,多个初始化块之间按照顺序结构执行 
 * 4. 每创建一个类的对象,非静态初始化就加载一次。 
 * 5. 非静态初始化块的执行,要早于构造器。
 * 
 *  静态代码块 
 * 1. 里面可以有输出语句 
 * 2.随着类的加载而加载,而且只被加载一次 
 * 3.多个静态代码块之间顺序结构执行
 * 4.静态代码块的执行要早于非静态代码块的执行 
 * 5. 静态代码块只能执行静态结构(属性,方法)
 *
 * 关于属性赋值: 1.默认的初始化 2. 显示的初始化或者初始化块(此处两个结构顺序执行) 3. 在构造其中 4. 通过方法对属性值修改
 */
public class TestOrder {
	public static void main(String[] args) {	
		Order order = new Order();
		System.out.println(order);

		System.out.println();
		System.out.println("*********************");
		System.out.println();

		Order order1 = new Order();
		System.out.println(order1);

		System.out.println();
		System.out.println("*********************");
		System.out.println();

		System.out.println("输出上面两个order对象之后发现,输出一模一样【不加上静态代码块的时候】,可证明:每创建一个类的对象,非静态初始化就加载一次");
		System.out.println("为了更好的证明,最好把构造器中的赋值去掉,只使用初始化块来赋值。打印的两个order对象依旧一样。");
		System.out.println("加上静态代码块之后,发现,输出的两个order对象不一样,只有第一个对象有静态代码块输出的内容,证明静态代码块只被加载一次");
	}
}

class Order {
	private String name;
	private int age;
	private static String nameOrder;

	public Order() {
		super();
		name = "王五";
		age = 16;
		System.out.println("这是无参构造器,new一个对象时候,最后一步执行,执行完构造器,对象就new出来了");
	}

	public Order(String name, int age) {
		super();
		this.name = name;
		this.age = age;
		System.out.println("这是有参构造器,new一个对象时候,最后一步执行,执行完构造器,对象就new出来了");
	}
    // 静态初始化块
	static {
		System.out.println("这里是静态代码块2");
		nameOrder = "麻子";
		// name = "赵云"; // 报错,写不出来
	}
	// 非静态初始化块
	{
		name = "张三";
		age = 14;
		System.out.println("这是第一个初始化块,第一步执行");
	}
	// 非静态初始化块
	{
		name = "李四";
		age = 15;
		System.out.println("这是第二个初始化块,第二步执行");
	}
	// 静态初始化块
	static {
		System.out.println("这里是静态代码块1");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Order [name=" + name + ", age=" + age + "]";
	}

}

这里是静态代码块2
这里是静态代码块1
这是第一个初始化块,第一步执行
这是第二个初始化块,第二步执行
这是无参构造器,new一个对象时候,最后一步执行,执行完构造器,对象就new出来了
Order [name=王五, age=16]

*********************

这是第一个初始化块,第一步执行
这是第二个初始化块,第二步执行
这是无参构造器,new一个对象时候,最后一步执行,执行完构造器,对象就new出来了
Order [name=王五, age=16]

*********************

输出上面两个order对象之后发现,输出一模一样【不加上静态代码块的时候】,可证明:每创建一个类的对象,非静态初始化就加载一次
为了更好的证明,最好把构造器中的赋值去掉,只使用初始化块来赋值。打印的两个order对象依旧一样。
加上静态代码块之后,发现,输出的两个order对象不一样,只有第一个对象有静态代码块输出的内容,证明静态代码块只被加载一次

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值