Java基礎--繼承方法調用順序


最近因為面試的原因,回過頭來復習基礎的知識,都忘光了,准備買本面試書回來啃。

我先把自己測試的結論總結寫出來,以后忘記再來看看


如果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();
	}

}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM