代码块分为两种:
静态代码块与非静态代码块
ps:代码块如果有修饰的话,那么只能使用static。
静态代码块:
1.里面可以有输出语句
2.随着类的加载而加载,而且只被加载一次
3.多个静态代码块之间按照顺序结构执行
4.静态代码块的执行要早于非静态代码块的执行
5.静态的代码块中只能执行静态的结构(类属性,类方法)
非静态代码块:
1.可以对类的属性(静态 & 非静态)进行初始化操作,同时也可以调用本类声明的方法(静态 & 非静态)
2.里面可以有输出语句
3.一个类中可以有多个非静态的代码块,多个代码块之间按照顺序结构执行
4.每创建一个类的地下,非静态代码就加载一次
5.非静态代码块的执行要早于构造器
代码示例:
public class TestOrder { public static void main(String[] args) { Order o1 = new Order(); System.out.println(o1); System.out.println(); Order o2 = new Order(); System.out.println(o2); } } class Order { private int orderId = 1001; private String orderName; private static String orderDesc; public Order() { System.out.println("我是空参构造器"); } //非静态初始化块 { orderId = 1002; orderName = "AA"; System.out.println("我是非静态代码块1"); orderDesc = "ORDER"; show(); show1(); } { orderId = 1003; System.out.println("我是非静态代码块2"); } //静态初始化块 static { System.out.println("静态代码块2"); orderDesc = "我是一个Order"; // orderId = 1001; 不可以 // show(); 不可以 show1(); } static { System.out.println("静态代码块1"); } public Order(String orderName) { this.orderName = orderName; } public int getOrderId() { return orderId; } public void setOrderId(int orderId) { this.orderId = orderId; } public String getOrderName() { return orderName; } public void setOrderName(String orderName) { this.orderName = orderName; } @Override public String toString() { return "Order{" + "orderId=" + orderId + ", orderName='" + orderName + '\'' + '}'; } public void show(){ } public static void show1(){ } }
结果:
静态代码块2
静态代码块1
我是非静态代码块1
我是非静态代码块2
我是空参构造器
Order{orderId=1003, orderName='AA'}我是非静态代码块1
我是非静态代码块2
我是空参构造器
Order{orderId=1003, orderName='AA'}
tips:关于赋值操作:
默认的初始化---->显式的初始化或代码块初始化(此处两个按照顺序执行)---->构造器中------>
------------------------------------>(以上是对象属性的初始化过程)---------------------------------------->
----------------------------------->通过方法对对象的相应属性修改