1. 程式人生 > >java類的繼承與構造方法

java類的繼承與構造方法

一、類的繼承

我們試著想象一下兩個類:學生類和大學生類 學生類 屬性:姓名、性別、年級、成績 方法:學習、休息 大學生類 屬性:姓名、性別、年級、成績、專業 方法:學習、休息、實習 我們可以看出來,大學生類的屬性和方法包含了學生類的屬性與方法,如果我們在定義這兩個類的時候將它們的屬性和方法全部定義一遍,就顯得麻煩同時不精簡,由此繼承的概念就出來了。 繼承:如果A類繼承了B類,我們將A類稱作B類的子類,B類就是A類的父類。子類擁有父類的全部屬性與方法,子類自身也能新增新的方法和屬性。繼承時需要用到的關鍵字是extends,具體的使用方法是:

public class 子類名 extends 父類名{}; 子類雖然擁有父類全部的屬性與方法,但是受限於訪問許可權,能夠呼叫的方法和屬性是限定的。 在這裡插入圖片描述

二、重寫與過載

重寫:子類繼承父類以後,可能之前父類的某個方法已經不能滿足子類的條件,這個時候我們就需要重寫/覆蓋該方法。 重寫的兩個條件: 1、重寫的方法的返回值、方法名、引數個數與型別必須全部一樣。 2、重寫的方法的訪問許可權不能比之前的訪問許可權小,可以擴大。 過載:過載與重寫的區別就在於,重寫的方法的引數型別或引數數量與之前的方法不一樣,返回值是否相同沒有關係,但是方法名必須保持一致。其訪問許可權沒有限制。

三、構造方法

類的構造方法可以理解為類的初始化。定義方式為:

public 類名(引數型別 引數名,.....){};

舉個例子:

public class Test {
	public static void main(String[] args)  {
		int a = 1;
        Circle cir = new Circle(a);
	}
}
public class Circle{
    public Circle(int a) {             //構造方法
        System.out.println("circle "+a);
    }
}

我在類Circle裡寫了一個構造方法,引數為一個int型數,當我建立Circle 的物件的時候需要為這個引數賦值,不然會報錯。 關於構造方法有幾個注意事項: 1、構造方法沒有返回值,他在建立物件使用new操作的時候被系統呼叫,構造方法的名字和類名必須一致。 2、在java中,如果我們沒有寫構造方法,建立物件時,系統會預設呼叫一個無引數的構造方法,如果寫了構造方法,系統則不會預設呼叫該構造方法。 3、構造方法可以被過載。我們可以在類中寫多個構造方法,但需要保證每個構造方法引數個數或者引數型別不一致。 多個構造方法舉例:

public class Test {
	public static void main(String[] args)  {
		int a = 1,b = 2;
        Circle cir = new Circle(a);
        Circle cir2 = new Circle(a,b);
        Circle cir3 = new Circle("圓");
	}
}
public class Circle{
    public Circle(int a) {
        System.out.println("circle "+a);
    }
    public Circle(int a,int b){
    	System.out.println("circle "+a+"and "+b);
    }
    public Circle(String a){
    	System.out.println("circle "+a);
    }
}

我們建立了三個物件,通過不同的賦值,分別系統呼叫了三個構造方法。 執行結果: 在這裡插入圖片描述 特別注意:建立某個子類物件時,會先呼叫其父類的構造方法。

public class Test {
	public static void main(String[] args)  {
		int a = 1;
        Circle cir = new Circle(a);
	}
}
public class Circle extends CC{
    public Circle(int a) {
        System.out.println("circle "+a);
    }
}
public class CC {

	public CC(){
		System.out.println("I am the father of Circle.");
	}
}

執行結果: 在這裡插入圖片描述 主方法中我們建立了Circle物件cir,Circle類繼承了類CC,最後的執行結果中顯示,我們是先呼叫了父類CC的構造方法,再呼叫子類Circle的構造方法。 我們試著將父類CC的構造方法改一下:

public class CC {

	public CC(int a){
		System.out.println("I am the father of Circle.");
	}
}

執行結果: 在這裡插入圖片描述

往父類CC的構造方法中添加了一個引數執行後會報錯。我們之前說過,如果一個類沒有寫構造方法,我們呼叫它的話系統會給一個預設的無引數的構造方法,但若寫了構造方法,這個預設的構造方法則不會呼叫。這一點父類也一樣,我們在建立子類物件的時候會先呼叫父類的構造方法。而對於子類來說,無論父類有沒有引數,都會呼叫預設的無引數的構造方法,但是因為上面程式碼中CC父類已經寫了一個有引數的構造方法,所以父類中並沒有一個預設的無引數的構造方法,編譯器便會報錯。 上面問題我們可以通過在父類中再寫一個無引數的構造方法來解決或者在子類中呼叫父類的構造方法。 在子類中呼叫父類的構造方法:

public class Circle extends CC{
    public Circle(int a) {
    	super(a);
        System.out.println("circle "+a);
    }
}