標籤:之間 類成員 bre 自己 rgs 遞迴 構造器 cte cto
在編程的過程中,我們經常會遇到多個類的繼承問題,那麼多個類的構造器是按照什麼順序調用的呢?
先看一段代碼:
1 public class Meal { 2 public Meal() { 3 System.out.println("meal constructor() "); 4 } 5 } 6 7 public class Bread { 8 public Bread() { 9 System.out.println("bread constructor() ");10 }11 }12 13 public class Cheese {14 public Cheese() {15 System.out.println("cheese constructor() ");16 }17 }18 19 public class Lettuce {20 public Lettuce() {21 System.out.println("Lettuce constructor() ");22 }23 }24 25 public class Lunch extends Meal {26 public Lunch() {27 System.out.println("Lunch constructor() ");28 }29 }30 31 public class PortableLunch extends Lunch {32 public PortableLunch() {33 System.out.println("PortableLunch constructor() ");34 }35 }36 37 public class Sandwich extends PortableLunch{38 private Bread bread=new Bread();39 private Cheese cheese = new Cheese();40 private Lettuce lettuce= new Lettuce();41 public Sandwich(){42 System.out.println("Sandwich constructor() ");43 }44 45 public static void main(String[] args) {46 new Sandwich();47 }48 }
上面一段代碼顯示多個類之間的關係:
每個類都有自己的初始化方法。
下面為列印輸出的內容:
1 meal constructor() 2 Lunch constructor() 3 PortableLunch constructor() 4 bread constructor() 5 cheese constructor() 6 Lettuce constructor() 7 Sandwich constructor()
構造器的調用遵循以下的順序:
(1):調用基類構造器。這個步驟會不斷地反覆遞迴下去,首先是構造這種階層的根,然後是下一層匯出類,等等,直到最低層的匯出類。
(2):按聲明順序調用成員的初始化方法。 .
(3):調用匯出類構造器的主體。(也就是文中的main方法中的內容)
這樣做的最終目的:讓方法中的所有成員變數都得到初始化。
構造器的調用順序是很重要的。當進行繼承時,我們已經知道基類的一切,並且可以訪問基類中任何聲明為public和protected的成員。這意味著在匯出類中,必須假定基類的所有成員都是有效。一種標準方法是,構造動作一經發生,那麼對象所有部分的全體成員都會得到構建。然而,在構造器內部,我們必須確保所要使用的成員都已經構建完畢。為確保這一目的,唯一的辦法就是首先調用基類構造器。那麼在進入子類構造器時,在基類中可供我們訪問的成員都已得到初始化。此外,知道構造器中的所有成員都有效也是因為,當成員對象在類內進行定義的時候,只要有可能,就應該對它們進行初始化(也就是說,通過組合方法將對象置於類內).
若遵循這一規則,那麼就能保證所有基類成員以及當前對象的成員對象都被初始化了。
java中構造器的調用順序