3.8 局部代码块—构造代码块—静态代码块

局部代码块

作用:控制变量的生命周期;

位置:方法中

在程序中,当我们已经使用完x后,并且在接下来的代码中,不会再用到x,那么就没必要让x在内存中占用空间了,这用情况下,可以使用局部代码块,将x及其所设计到的区域封装为局部代码块,它们在程序执行中顺序不变,只是在执行完成后消失。

public class CodeblockTest {

	public static void main(String[] args) {
		{
			int x = 9;
			System.out.println(x);
		}
		System.out.println("Hello World !");
		
		//可以再次出现变量x
		int x = 10;
		System.out.println(x);
	}

}

结果:

9

Hello World !

10


容易出错的情况

public class CodeblockTest2 {

	public static void main(String[] args) {
		{  
            //  局部代码块  
            int x = 30;
            System.out.println(x);  
        }  
        int x = 100;
		System.out.println(x);  
		// 第一种写法:先定义了代码块局部变量后定义方法局部变量,
		// 代码块局部变量x只能作用于定义它的代码块,
		// 也就是说出了代码块该x就被销毁了,所以后来再定义一个方法局部变量是可以的。
        
        
        /* 
        int x = 100;  
        {  
            //  局部代码块  
            int x = 30;  
        }  
        System.out.println(x);
        */
        // Duplicate local variable x 重复定义变量x
		// 第二种写法:先定义了方法局部变量后定义了代码块局部变量,
		// 方法局部变量的作用域是整个方法,
		// 出了该方法后这个方法局部变量才被销毁,此例中,
		// 在方法局部变量还未被销毁时就定义了相同名字的代码块局部变量,
		// 所以被视为重复定义
	}

}

构造代码块

作用:它可以给所有对象进行初始化

位置:类中

当类中的构造方法以重载的形式存在时,并且有共同成员变量或共同的方法时,可以通过构造代码块对其进行初始化;这样可以减少代码的重复。

public class CodeblockTest3 {
	public static void main(String[] args) {
		Person p = new Person();
		Person p1 = new Person("LiSi", 23);
	}
	
}

class Person {
	private String name;
	private int age;
	{
		System.out.println("cons code run !");
	}

	Person() // 给对应的对象进行初始化
	{
		System.out.println("Person Now:RUN !");
		System.out.println("eat————");
	}

	Person(String name, int age) {
		this.name = name;
		this.age = age;
		System.out.println(this.name + "————" + this.age);
		System.out.println("eat————");
	}

}

我们可以看到类Person中 重载的构造方法中有共同的代码System.out.println("eat————");我们可以将他封装进构造代码块,用来给各种进行初始化。

优化后,代码体现为:

public class CodeblockTest3 {
	public static void main(String[] args) {
		Person p = new Person();
		Person p1 = new Person("LiSi", 23);
	}

}

class Person {
	private String name;
	private int age;
	{
		System.out.println("cons code run !");
		eat();
	}

	Person() // 给对应的对象进行初始化
	{
		System.out.println("Person Now:RUN !");
	}

	Person(String name, int age) {
		this.name = name;
		this.age = age;
		System.out.println(this.name + "————" + this.age);
	}

	public void eat() {
		System.out.println("eat————");
	}

}

静态代码块:

特点:

1. 随着类的加载而执行,而且只一次。

2. 优先于主函数执行。

作用:给类进行初始化。

位置:类中

当类中的方法都被静态了化,并且构造方法被private了,这是我们不能,在将这个类实例化,然而又想让类增加一些属性,就可以使用静态代码块。

public class CodeblockTest4 {
	static {
		System.out.println("B");
	}

	public static void main(String[] args) {
		new StaticCode().show();
	}

	static {
		System.out.println("C");
	}
}

class StaticCode {
	static {
		System.out.println("A");
	}

	public void show() {
		System.out.println("Hello World !");
	}
}

执行顺率:static{}(静态代码块)--》{}(构造代码块)--》构造函数

public class CodeblockOrderTest {
	public static void main(String[] args) {
		People.show();
	}
}

class People {
	static {
		System.out.println("1-静态代码块");
	}
	{
		System.out.println("2-构造代码块");
	}

	People() {
		System.out.println("3-构造方法");
	}

	static void show() {
		System.out.println("静态方法");
	}

	public void speak() {
		System.out.println("非静态方法");
	}
}

结果:

1-静态代码块

静态方法

public class CodeblockOrderTest {
	public static void main(String[] args) {
		new People().speak();
	}
}

class People {
	static {
		System.out.println("1-静态代码块");
	}
	{
		System.out.println("2-构造代码块");
	}

	People() {
		System.out.println("3-构造方法");
	}

	static void show() {
		System.out.println("静态方法");
	}

	public void speak() {
		System.out.println("非静态方法");
	}
}

结果:

1-静态代码块

2-构造代码块

3-构造方法

非静态方法

public class CodeblockOrderTest {
	public static void main(String[] args) {
		People.show();
		new People().speak();
	}
}

class People {
	static {
		System.out.println("1-静态代码块");
	}
	{
		System.out.println("2-构造代码块");
	}

	People() {
		System.out.println("3-构造方法");
	}

	static void show() {
		System.out.println("静态方法");
	}

	public void speak() {
		System.out.println("非静态方法");
	}
}

结果:

1-静态代码块

静态方法

2-构造代码块

3-构造方法

非静态方法


你可能感兴趣的:(3.8 局部代码块—构造代码块—静态代码块)