Java之路:代码块

代码块

代码块是一种常见的代码形式。它用大括号“{ }”将多行代码封装在一起,形成一个独立的代码区域,这就构成了代码块。代码块的格式如下:

{
  	//代码块
}

代码块有四种:
(1)普通代码块。
(2)构造代码块。
(3)静态代码块。
(4)同步代码块。

代码块不能够独立运行,须要依赖于其他配置。

1、普通代码块

在方法名后(或方法体内)用一对“{ }”括起来的数据块就是普通代码块。它不能够单独存在于类中,需要紧跟在方法名后面,并通过方法调用。

public class NormalCodeBlock {
	public static void main(String[]args) {
		//“{}”括起来的部分就是普通的代码块
	{
		int x=10;
        System.out.println("普通代码块内,x="+x);
	}
	int x=100;
	System.out.println("x="+x);
	}
}

【结果】
在这里插入图片描述
在普通代码块内,变量的作用范围自左花括号“{”内定义处开始,到右花括号“}”结束。

2、构造代码块

构造代码块就是在类中直接定义的,且没有任何前缀、后缀以及修饰符的代码块。

在一个类中,至少需要有一个构造方法(如果用户自己不显式定义,编译器会“隐式”地配备一个),它在生成对象时被调用。

构造代码块和构造方法一样是在对象生成时被调用,但是它的调用时机比构造方法还要早。 由于这种特性,构造代码块可用来初始化成员变量。

如果一个类中有多个构造方法,这些构造方法都需要初始化成员变量,那么就可以把每个构造方法中相同的代码部分抽取出来,集中一起放在构造代码块中。

这样利用构造代码块来初始化共有的成员变量,可大大减少不同构造方法中重复的代码,提高代码的复用性。

public class Test3 {
	public static void main(String[]args) {
		Person p1=new Person();
	    System.out.println("---------------------");
	    Person p2=new Person("Zhang");
	}
}

class Person {
	//构造代码块
	{
		System.out.println("构造代码块执行……");
		x=100;
	}
	//构造方法的代码块
	Person() {
	    System.out.println("构造方法执行……");
	    name="Guangzi";
	    show();
	}
	//构造方法的代码块
	Person(String name) {
	    System.out.println("构造方法执行……");
	    this.name=name;
	    show();
	}
	
	void show() {
	    System.out.println("Welcome!"+name);
	    System.out.println("x="+x);
	}
	
	private String name;
	private int x;
}

【结果】
在这里插入图片描述
【结果分析】
在Person类中,对类的数据成员x进行初始化。如果语句“x = 100;”不放置于代码块中,要达到相同的效果,此句语句就需要分别出现在构造方法Person()和Person(String name)中。如果使用默认值来初始化类中的成员变量比较多,很明显,使用构造代码块能节省很多代码空间。

【注意事项】

(1)构造代码块中的初始化是一个类的所有构造方法都共有的“交集”部分,具有个性化特征的初始化还是要放在各自的构造方法中。

(2)构造代码块不在任何方法之内,仅位于类的范围内,它的地位和其他方法体是对等的。

(3)可以理解为构造代码块是没有名称的方法体,但仅限用于对类数据成员的初始化,且仅运行一次。

(4)在类被实例化的过程中,构造代码块内的代码比构造方法先执行。

(5)构造代码块*不仅可以减少代码量,也提高了代码的可读性,善用构造代码块能够给编码带来许多便利。

3、静态代码块

使用static关键字加以修饰并用大括号“{ }”括起来的代码块称为静态代码块,其主要用来初始化静态成员变量。它是最早执行的代码块。

public class StaticCodeBlock {
	//静态代码块
	static
	{
		System.out.println("静态代码块执行……");
	}
	//构造方法
	public StaticCodeBlock() {
		System.out.println("构造方法执行……");
	}
	//构造代码块
	{
		System.out.println("构造代码块执行……");
	}

	public static void main(String[] args) {
	    System.out.println("main方法开始执行……");
	    System.out.println("创建第1个对象……");
	    new StaticCodeBlock();
	    System.out.println("创建第2个对象……");
	    new StaticCodeBlock();
	    System.out.println("创建第3个对象……");
	    new StaticCodeBlock();
	}
}

【结果】
在这里插入图片描述
【结果分析】

从结果可以看出,静态代码块的执行时间比主方法main()方法都要早,静态块还优先于构造方法的执行

【注意事项】

(1)在执行时机上,静态代码块在类加载时就会执行,因此早于构造代码块、构造方法。
(2)当静态代码块和main方法属于同一个类时,静态代码块比main方法执行早。静态块的执行级别是最高的。
(3)不管有多少个实例化对象产生,静态块都只执行一次。
(4)利用这种特性,静态代码块可以被用来初始化类中的静态成员变量。 静态成员变量是属于所有类对象共享的,故此不会受到创建对象个数的影响。

猜你喜欢

转载自blog.csdn.net/qq_43555323/article/details/84783193