1. 程式人生 > >java 建構函式和super

java 建構函式和super

package one;
class book
{
	book()
	{System.out.println("這是沒有引數的父類的構造方法");}
	book(int i)
	{System.out.println("有引數   父類的構造方法");}
	
	public void get()
	{System.out.println("book父類");}
		
}
class dictionary extends book
{
	dictionary()  
	{System.out.println("子類 無引數 的構造方法哦");}	
	dictionary(int i)
	{System.out.println("子類 有引數 的構造方法哦");}
	
	
	public void get() //子類覆蓋父類的方法
	{
	System.out.println("子類dictionary.");
	}
	public void get(int pages)  /*get方法的過載, 過載是  方法名相同,引數表不同*/	
	{
	System.out.println("子類dictionary get方法過載.");
	}
	public void son()
	{
		System.out.println("這是子類新新增的方法,父類沒有哦.");
	}
}

public class haha { 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		book a= new book();
		System.out.println("-----------------");
		book e= new book(123);
		System.out.println("-----------------");
		book b= new dictionary(2);//多型  向上型別轉換
		System.out.println("-----------------");
		dictionary c=new  dictionary(3);
		System.out.println("-----------------");
		dictionary d=new  dictionary();
		b.get();		 
        c.son();
//		b.son();   此句編譯不通過
		/*(程式設計看左邊,執行看右邊)book b= new dictionary(2); 
		 即編譯器看的是引用變數,因為book類裡面沒有son這個方法*/


	}

}

執行結果

這是沒有引數的父類的構造方法
-----------------
有引數   父類的構造方法
-----------------
這是沒有引數的父類的構造方法
子類 有引數 的構造方法哦
-----------------
這是沒有引數的父類的構造方法
子類 有引數 的構造方法哦
-----------------
這是沒有引數的父類的構造方法
子類 無引數 的構造方法哦
子類dictionary.
這是子類新新增的方法,父類沒有哦.

1 呼叫子類建構函式的時候,會預設先呼叫父類的無引數構造方法,即相當於隱藏了一行程式碼 super();

2.在你程式沒有寫構造方法時候,編譯器會預設幫你寫一個無引數的

構造方法,只不過方法裡面沒有內容 然而當你編寫了建構函式的話,編譯器就不會再幫你新增無引數的構造方法了,即使你只編寫了有引數的構造方法。 如果你已經寫了一個有引數的建構函式,並且你需要一個沒有引數的建構函式,你必須自己動手寫。 只要你有自己寫的建構函式,不管是哪一種,這都會想是在跟編譯器說:老兄,我自己的建構函式不用你管。

在這裡插入圖片描述

寫了book(i),而沒有寫book()這種無引數的,編譯器會認為你既然寫了構造函數了,我就不管了,所以不會為你預設新增book() 而子類的建構函式是要先呼叫父類的,預設無引數的建構函式,此時我們因為沒有定義這種,所以報錯。

在這裡插入圖片描述

dictionary()通過super(i)呼叫父類建構函式。編譯成功

dictionary(i)沒有編譯成功,是因為預設 子類建構函式 先呼叫無引數的父類建構函式,super() ,然後因為沒有嘛,所以錯誤。

建構函式的作用 來初始化物件的狀態。