Java中普通代码块、构造代码块、静态代码块的区别

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:24px;"><strong>一、普通代码快</strong></span></span>

概念:在方法或语句中出现的{}就称为普通代码块。

执行顺序:普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定。即:“先出现先执行”。

代码示例:

public class CodeBlock01 {
	public static void main(String[] args) {
		{
			int x = 3;
			System.out.println("1,普通代码块内的变量x=" + x);
		}
		int x = 1;
		System.out.println("主方法内的变量x=" + x);
		{
			int y = 7;
			System.out.println("2,普通代码块内的变量y=" + y);
		}
	}
}

/*
 * 运行结果:
 *  1,普通代码块内的变量x=3 
 *  	主方法内的变量x=1 
 *  2,普通代码块内的变量y=7
 */

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:24px;">二、构造代码块</span></span>

概念:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。

执行顺序:构造代码块在创建对象时被调用,每次创建对象都会被调用构造代码块的执行次序优先于类构造函数。

特点:构造代码块其实就是一个“初始化”的代码段,优先于构造函数,对所有的类的对象都是一样的初始化,不像构造函数,不同的对象可以有不同的初始化结果

class CodeBlock02 {
	{
		System.out.println("第一代码块");
	}

	public CodeBlock02() {
		System.out.println("构造方法");
	}

	{
		System.out.println("第二构造块");
	}

	public static void main(String[] args) {
		new CodeBlock02();
		new CodeBlock02();
	}
}
/*
第一代码块
第二构造块
构造方法
第一代码块
第二构造块
构造方法
 */

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><strong><span style="font-size:24px;">三</span></strong></span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:24px;">、静态代码块</span></span>

概念:在java类中static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。

执行顺序:由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。如果类中出现多个静态代码块,那么"先定义的代码先执行,后定义的代码后执行"

注意:

1 静态代码块不能存在于任何方法体内。

2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。

代码示例:

class Code {
	{
		System.out.println("Code的构造块");
	}

	static {
		System.out.println("Code的静态代码块");
	}

	public Code() {
		System.out.println("Code的构造方法");
	}
}

class CodeBlock03 {
	{
		System.out.println("CodeBlock03的构造块");
	}

	static {
		System.out.println("CodeBlock03的静态代码块");
	}

	public CodeBlock03() {
		System.out.println("CodeBlock03的构造方法");
	}

	public static void main(String[] args) {
		System.out.println("CodeBlock03的主方法");
		new Code();
		new Code();
		new CodeBlock03();
		new CodeBlock03();
	}
}
/*
CodeBlock03的静态代码块
CodeBlock03的主方法
Code的静态代码块
Code的构造块
Code的构造方法
Code的构造块
Code的构造方法
CodeBlock03的构造块
CodeBlock03的构造方法
CodeBlock03的构造块
CodeBlock03的构造方法
*/

四、静态代码块(包括静态函数)内不能对类中非静态的成员进行操作,比如输出一个成员变量的初始值,但是该变量不是静态类型的,这是不允许的;(不同于构

造代码块)。

class StaticCode {
	int num = 9;
	// 这是静态代码块,不允许访问非静态成员
	static {
		System.out.print(num);// 非法
	}
	// 这是构造代码块,可以访问非静态成员
	{
		System.out.print(num);// 可以
	}
}

发布了33 篇原创文章 · 获赞 20 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/huangwenkui1990/article/details/38540361
今日推荐