企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### [初始化的顺序](https://lingcoder.gitee.io/onjava8/#/book/06-Housekeeping?id=%e5%88%9d%e5%a7%8b%e5%8c%96%e7%9a%84%e9%a1%ba%e5%ba%8f) 在类中变量定义的顺序决定了它们初始化的顺序。即使变量定义散布在方法定义之间,它们仍会在任何方法(包括构造器)被调用之前得到初始化。例如: ~~~ // housekeeping/OrderOfInitialization.java // Demonstrates initialization order // When the constructor is called to create a // Window object, you'll see a message: class Window { Window(int marker) { System.out.println("Window(" + marker + ")"); } } class House { Window w1 = new Window(1); // Before constructor House() { // Show that we're in the constructor: System.out.println("House()"); w3 = new Window(33); // Reinitialize w3 } Window w2 = new Window(2); // After constructor void f() { System.out.println("f()"); } Window w3 = new Window(3); // At end } public class OrderOfInitialization { public static void main(String[] args) { House h = new House(); h.f(); // Shows that construction is done } } ~~~ 输出: ~~~ Window(1) Window(2) Window(3) House() Window(33) f() ~~~ 在**House**类中,故意把几个**Window**对象的定义散布在各处,以证明它们全都会在调用构造器或其他方法之前得到初始化。此外,**w3**在构造器中被再次赋值。 由输出可见,引用**w3**被初始化了两次:一次在调用构造器前,一次在构造器调用期间(第一次引用的对象将被丢弃,并作为垃圾回收)。这乍一看可能觉得效率不高,但保证了正确的初始化。试想,如果定义了一个重载构造器,在其中没有初始化**w3**,同时在定义**w3**时没有赋予初值,那会产生怎样的后果呢?