最近因為面試的原因,回過頭來復習基礎的知識,都忘光了,准備買本面試書回來啃。
我先把自己測試的結論總結寫出來,以后忘記再來看看
如果b類繼承自a類,在main方法中new出b的對象(不帶參數),那么他執行的順序是:
父類a的靜態方法-->類b的靜態方法-->父類a的非靜態方法(不指定方法名)-->父類a的無參構造-->
這個時候在父類無參構造里面調用了父類的print方法,兩種可能
1.如果子類沒有相應的print方法,那么直接調用父類的print方法。
2.如果子類重寫了父類的print方法,那么不會調用父類的print,優先調用子類的print方法,但是仍然可以在子類的print方法里面使用super調用父類的print方法。
-->子類b的非靜態方法(不指定方法名)-->子類b的無參構造方法
這里注明一點,如果在new出b對象的時候帶上參數,那么大致仍然是上面的流程,只是會調用父類的無參構造(所以在new子類對象的時候,不管帶不帶參數,都一定會執行父類的無參構造),而后子類則是調用有參構造方法。上面寫的有點繞,最好自己測試下,然后總結。
貼上測試的源碼:
package test1; public class test1 { static class a { int x = 999; int y = 999; { System.out.println("a--父類非靜態方法"); } static { System.out.println("a--父類靜態方法"); } public a() { System.out.println("a--執行a類無參構造方法"); print(); } public a(int x) { System.out.println("a--執行父類有參構造方法"); } public void print() { System.out.println("a--我是父類的打印方法"); } } static class b extends a { int x = 1; int y; { System.out.println("b--子類非靜態方法"); } static { System.out.println("b--子類靜態方法"); } public b() { System.out.println("b--執行b類無參構造方法"); //y = -1; } public b(int x) { System.out.println("b--執行子類有參構造方法"); } public void print() { System.out.println("b--在子類中調用父類的super方法"); super.print(); System.out.println("b--我是子類的打印方法"); } } public static void main(String[] args) { // TODO Auto-generated method stub int x = 0; new b(x); //a.print(); } }