类的第四个成员:初始化块(代码块)【属性、方法、构造器】
1.代码块如果有修饰的话,那么只能使用static
2.使用static修饰的叫静态代码块,没有使用static的叫非静态代码块。
一个复杂的实例:非静态代码块:
1、可以对类的属性(静态的 & 非静态的)进行初始化操作,同时可以调用本类中声明的方法(静态的 & 非静态的)。
如:
class Order { private String orderName; private int orderId; { orderName = "desc"; orderId = 1001; }2、里面可以有输出语句。如:
{ orderName = "desc"; orderId = 1001; System.out.println("我是非静态代码块1."); }3、一个类中可以有多个非静态代码块,多个代码块之间按照顺序执行。
如:
class Order { private String orderName; private int orderId; { orderName = "desc"; orderId = 1001; System.out.println("我是非静态代码块1."); } { System.out.println("我是非静态代码块2."); }4、每创建一个对象,非静态代码块就加载一次。
5、非静态代码块的执行要早于构造器!
如:
{ orderName = "desc"; orderId = 1001; System.out.println("我是非静态代码块1."); } { System.out.println("我是非静态代码块2."); } public Order() { System.out.println("我是Order类的空参构造器!"); }或者:
public Order() { System.out.println("我是Order类的空参构造器!"); } { orderName = "desc"; orderId = 1001; System.out.println("我是非静态代码块1."); } { System.out.println("我是非静态代码块2."); }
★★★★★★★★★★★★★注:属性复制操作的顺序:①默认初始化。②显示的初始化或代码块初始化(此处两个结构按照先后顺序执行)。③构造器中初始化。④通过方法对对象的属性初始化。
静态代码块:
1、可以有输出语句。
2、随着类的加载而加载,而且仅加载一次。
3、多个静态代码块按照出现顺序执行。
4、静态代码块的执行要早于非静态代码块的执行,与出现顺序无关。
5、静态代码块中只能调用静态属性或者静态方法。
class Root { static { System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root() { System.out.println("Root的无参构造器"); } } class Mid extends Root { static { System.out.println("Mid的静态初始化块"); } { System.out.println("Mid的普通初始化块"); } public Mid() { System.out.println("Mid的无参构造器"); } public Mid(String msg) { this(); System.out.println("Mid的带参数构造器,其参数值:" + msg); } } class Leaf extends Mid { static { System.out.println("Leaf的静态初始化块"); } { System.out.println("Leaf的普通初始化块"); } public Leaf() { super("我爱你!"); System.out.println("执行Leaf的构造器"); } } public class Test { public static void main(String[] args) { new Leaf(); } } /* *输出结果: * Root的静态初始化块 * Mid的静态初始化块 * Leaf的静态初始化块 * Root的普通初始化块 * Root的无参构造器 * Mid的普通初始化块 * Mid的无参构造器 * Mid的带参数构造器,其参数值:我爱你! * 执行Leaf的构造器 */