阿里云【名师课堂】Java面向对象开发48 ~ 50:代码块


现阶段代码块并不是一个重点概念,作为结构清楚一下就好。
所谓代码块指的是使用{}定义的一段程序代码,而代码块根据其定义的位置以及声明的关键字的不同一共可以分为四类:普通代码块、构造块、静态块、同步代码块。

  • 同步代码块在多线程部分讲解。

48、普通代码块

定义在方法中的代码块。

范例:观察一个简单程序

public class TestDemo {
	public static void main(String args[]) {
		if (true){
			int x = 10 ;  // 局部
			System.out.println("x = " + x) ;
		}
		int x = 100 ;  // 全局
		System.out.println("x = " + x) ;
	}
}

在这里插入图片描述
此时如果把if(true)去掉,就是一个普通代码块:

public class TestDemo {
	public static void main(String args[]) {
		{  // 直接使用大括号进行了定义,普通代码块
			int x = 10 ;  // 局部
			System.out.println("x = " + x) ;
		}
		int x = 100 ;  // 全局
		System.out.println("x = " + x) ;
	}
}

输出还是10、100。
功能很鸡肋,可能有用之处:代码写的过于复杂,而且又需要避免变量重名问题,往往会使用普通代码块,但是一般情况下用不到。

49、构造块

定义在类中的代码块。

范例:定义构造块

class Person{
	{
		System.out.println("1、Person类的构造块") ;
	}
	public Person(){
		System.out.println("2、Person类的构造方法") ;
	}
}

public class TestDemo {
	public static void main(String args[]) {
		new Person() ;
		new Person() ;
	}
}

在这里插入图片描述
使用new实例化对象时一定会调用构造方法,但是定义了构造块之后构造块会优先于构造方法执行。构造块的好处是可以进行简单的逻辑操作(避免这些操作出现在构造方法里)。

class Person{
	private String info = "hello" ;
	{  // 现在构造块中进行一些处理
		for(int i = 0 ; i < 10 ; i++){
			info += i ;
		}
		System.out.println("1、Person类的构造块") ;
	}
	public Person(){  // 然后把处理好的数据交给构造方法使用
		System.out.println("2、Person类的构造方法 " + info) ;
	}
}

public class TestDemo {
	public static void main(String args[]) {
		new Person() ;  // 使用new实例化对象时一定会调用构造方法
	}
}

在这里插入图片描述
实际上并没有什么用。

50、静态代码块

使用static关键字定义的代码块。

分为两种情况:

  • 在非主类中定义的静态块;
  • 在主类中定义的静态块。

在非主类中

观察静态块定义

class Person{
	{
		System.out.println("1、Person类的构造块") ;
	}
	public Person(){
		System.out.println("2、Person类的构造方法") ;
	}
	static {
		System.out.println("3、Person类的静态块") ;
	}
}

public class TestDemo {
	public static void main(String args[]) {
		new Person() ;  // 使用new实例化对象时一定会调用构造方法
		new Person() ;
	}
}

在这里插入图片描述
可以看出:

  1. 使用顺序:静态块优先于构造块优先于构造方法;
  2. 不管实例化多少对象,静态块只使用一次。

静态块最主要的作用就是为static属性进行初始化。

class Person{
	private static String info = "hello" ;
	{
		System.out.println("1、Person类的构造块") ;
	}
	public Person(){
		System.out.println("2、Person类的构造方法") ;
	}
	static {
		info += "world" ;
		System.out.println("3、Person类的静态块" + info) ;
	}
}

public class TestDemo {
	public static void main(String args[]) {
		new Person() ;  // 使用new实例化对象时一定会调用构造方法
		new Person() ;
	}
}

在这里插入图片描述

在主类中

如果在主类中定义静态块,那么静态块会优先于主方法执行。

public class TestDemo {
	public static void main(String args[]) {
		System.out.println("hello world") ;
	}
	static {
		System.out.println("**********") ;
	}
}

在这里插入图片描述
实际上也没什么用。

总结

如果在一些属性使用前需要做处理就是用构造块或静态块完成。

posted @ 2020-06-12 15:13  溺水的情书  阅读(168)  评论(0编辑  收藏  举报