面向对象编程
代码块 Code block
1 什么是代码块
1) 代码块
属于类的成员,也就是说,代码块
具有和属性、方法一样的性质,如非静态成员每个对象都会存在一份。
2) 代码块
本质上是用{}
括起来的一段代码,这段代码本质上与写在方法中的代码一样。
3) 代码块
实际上是一段运行代码,也就是说,代码块
是随着自身加载而运行的一段代码。因此,代码块
主要用于初始化。
2 代码块的使用
1) 代码块的创建
- 在类中定义
代码块
的格式为:{xxx}
。 代码块
不像属性和方法那样在创建时需要设置权限修饰符来限定权限,甚至都没有名字,代码块
能且只能被关键字static
修饰。- 可以这样理解:
代码块
的角色就是在对应类或对应对象创建时(本质上是代码块本身被加载时)执行的一段代码,因此不存在也不需要权限或代码块名。
而static
关键字决定一个结构的加载,因此代码块
是否使用static
决定了其执行(或者其加载)的时机。
- 可以这样理解:
2) static代码块代码块
属于类的成员,static代码块
与属性、方法等其他加了static
的类的成员一样,意味着该结构随着类的加载而加载,只存在一份。
换句话说,static代码块
是在类加载时运行的。
注意,代码块
仅在自身加载时运行一次,也就是说,static代码块
在类加载完成运行一次后就不会再运行了,只会运行一次。
因此,static代码块
也无所谓被类的对象共享了,因为类加载时运行过了,即使实例化的对象共享它,也没有意义。
3) 非static代码块代码块
属于类的成员,因此非static代码块
与类中其他非static
结构一样,意味着该结构随着对象的加载而加载,每个对象都会有一份。
换句话说,非static代码块
在对象构造时运行一次。
4) 代码块使用的其他注意点
- 与其他类的成员一样,
代码块
也可以定义多个,但往往没有必要,因为都是在类或对象加载时运行一次后就没什么用了,所有要初始化的代码完全都可以放在一个代码块
内。 - 当定义了多个
代码块
时,多个代码块
的按照其在类中声明的顺序执行。 - 代码块运行代码先于构造器内部运行代码,也就是说如果构造对象时的构造方法中存在其他运行代码,先运行由构造对象加载出的代码块再运行构造方法中的运行代码。
3 示例
- 具体理解,就要理解子类空参构造器隐式加载父类
super()
,并且子类构造的对象也相当于构造了父类的对象。 - 简单理解,子类加载一定是先加载父类,因为子类要继承父类,然后子类的对象一定也是父类的对象,最后就是代码块先于构造器运行。