1.代码块作用.
(1). 用于初始化类或对象的信息,即初始化类或对象的成员变量.
2.代码块格式
(1). 非静态代码块格式 :
{ //代码区 } (2). 静态代码块格式 static { //代码区 }
3.使用与区别
(1). 静态代码块 :
- 随着类的加载而执行.
- 由于类的加载只会执行一次,故静态代码块的执行,也只会有一次.
- 作用 : 用来初始化类的信息.
- 内部可以声明变量,调用属性或方法,编写输出语句等操作.
- 静态代码块的执行要先与非静态代码块的执行.(只有当类被加载到内存中,才能创造对象)
- 如果声明有多个静态代码块,则按照声明的先后顺序执行.
- 静态代码块内部只能调用静态结构(静态的属性或方法),而不能调用非静态的结构(实例的属性或实例方法).
(2). 非静态代码块 :
- 随着对象的创建而执行.
- 每创建一个对象,便执行一次非静态代码块
- 作用 : 初始化对象的信息.
- 内部可以声明变量,调用属性或方法,编写输出语句等操作.
- 如果声明有多个非静态代码块,则按照声明的先后顺序执行.
- 非静态代码块内部可以调用非静态结构,也可以调用非静态结构.(此时类已被加载,故可以调用非静态结构)
4.发现的问题
问题 : (1).static静态代码块中声明的变量并不能用static修饰,否则会报错.
答 : 静态代码块是在类加载的时执行的,静态变量是在类加载时初始化的,如果在静态代码块中使用static修饰变量,会导致变量重复初始化,从而引发错误。
解决 : 可以将变量声明为非静态变量,并在静态代码块中进行初始化。
class Person { static { int i = 9; System.out.println(i); } }
5.代码执行顺序
1.默认复制 --- 2.显式赋值 --3.构造器赋值 --4.代码块赋值 --5.通过对象.方法(set方法)赋值.
执行顺序为 : 1 - 2 / 4 - 3 - 5
public class ExerText { public static void main(String[] args) { Exer p = new Exer(); System.out.println(p.i); //输出i为5 } } class Exer { //显式赋值 int i = 3; //构造器赋值 public Exer() { i = 5; } //代码块赋值 { i = 9; } }