JAVA知識撿漏——構造函數、抽象類和抽象方法

1.構造方法

**概述和作用:**創建對象,給對象中的成員進行初始化,即在創建對象時,除了使用關鍵字new 之外 還得藉助構造方法,來完成對類的實例化。
構造方法格式特點:

  • 方法名與類名相同
  • 沒有返回值類型,連void都沒有
  • 沒有具體的返回值
2.構造方法分爲無參構造方法和有參構造方法?

(1)無參構造方法

class Student{
	public Student(){
		System.out.println("無參數方法調用");
	}
}

public class gouzao_1 {

	
	
	public static void main(String[] args){
		Student student=new Student(); //實例化對象
	}//該方法是無參的構造方法,即構造方法不接收參數,執行後輸出即可,無參的構造方法被調用。
}

(2)有參構造方法
爲一個屬性賦值有兩種方法:①、直接訪問對象屬性 ②、通過setXxx()方法
如果想在實例化對象的同時就爲這個對象的屬性進行賦值,可以通過帶參數的構造方法來實現。

package company;


class Student_1{
	private String name;
	private int age;
//	public Student_1(String name,int age){
//		this.name=name;
//		this.age=age;
//	}
	
	public void show(){
		System.out.println("姓名"+name+"年齡"+age);
	}


	public void setName(String name) {
		this.name = name;
	}


	public void setAge(int age) {
		this.age = age;
	}
}
public class gouzao_2 {

	public static void main(String[] args){
//		Student_1 student=new Student_1("王小五",25); //實例化對象
		Student_1 stu=new Student_1(); //有參構造函數實例化對象
		stu.setName("三毛");
		stu.setAge(24); //使用setXxx設置參數
		
		
		stu.show();
	}
}

3.構造方法注意事項

1.java中的每一個類都至少有一個構造方法,如果我們沒有創建,系統會爲我們創建一個默認的無參構造方法。(不顯示代碼)

2.但是如果我們定義了構造方法,系統就不會再爲我們提供默認的無參構造方法了。這個時候想使用無參構造方法必須自己定義。因爲實例化對象時,不一定會輸入參數,那麼沒有無參的構造方法,又不輸入參數,就會出錯。

3.構造方法需要用public來修飾,若使用private,在其他類中無法將其實例化。

4.構造方法是可以重載的。
子類是不繼承父類的構造方法的,只是顯式或隱式的調用。
子類和父類構造方法的調用:
https://www.jianshu.com/p/f0515d6d9033

4.抽象方法

①由abstract修飾

②只有方法的定義,沒有方法的實現({}都沒有)

③子類實現了父類的抽象方法後,可以正常進行實例化,並通過實例化對象調用方法

5.抽象類

如果一個類中包含抽象方法,那麼這個類就是抽象類。在Java語言中,可以通過把類或者類中的某些方法聲明爲abstract(abstract只能用來修飾類或者方法,不能用來修飾屬性)來表示一個類是抽象的。只要包含一個抽象方法的類就必須被聲明爲抽象類,抽象類可以聲明方法的存在而不去實現它,被聲明爲抽象的方法不能包含方法體。在實現時,必須包含相同的或者更更低的訪問級別(public→protected→private)。抽象類在使用過程中不能被實例化,但是可以創建一個對象使其指向具體子類的一個實例。抽象類的子類爲父類中的所有抽象方法提供具體的實現,否則它們也是抽象類。

//抽象類的格式
abstract class className{
	//屬性
	//方法
	//抽象方法
}

①由abstract修飾

②包含抽象方法的類必須是抽象類,不包含抽象方法的類也可以是抽象類

③抽象類不能被實例化(需要被繼承)

(1)抽象類是不可以被實例化的,因爲抽象類中有可能包含抽象方法,抽象方法是沒有方法體的,不可以被調用。如果想調用抽象類中定義的方法,則需要創建一個子類,在子類中將抽象類中的抽象方法進行實現。
(2)abstract和final關鍵字不可以同時修飾一個類。因爲final使類不可繼承,而abstract修飾的類,如果不繼承則無意義。

④抽象類都是要被繼承的,子類繼承後:(1)子類中重寫父類的抽象方法(建議)(2)子類也聲明爲抽象類

⑤抽象類的意義

(1)父類的意義:(抽象類都是父類,不能被實例化,只能被繼承)
①封裝所有子類所共有的數據和行爲
②爲所有子類提供了一種公共的類型,避免該類被實例化
(2)包含抽象方法:爲所有子類提供了一個統一的入口(定義公共抽象方法,由子類提供不同的實現)

6.接口

接口就是指一個方法的集合,接口中的所有方法都沒有方法體,在Java語言中,接口是通過關鍵字interface來實現的。接口可以被看作是抽象類的變體。接口中的所有方法都是抽象的,可以通過接口來間接地實現多重繼承。接口中的成員變量都是static final類型。由於抽象類可以包含部分方法的實現,因此,在一些場合下抽象類比接口存在更多的優勢。


//接口的格式
interface interfaceName{
	//全局常量
	//抽象方法
}

①是一個標準,一個規範

②由interface定義

③只能包含常量和抽象方法
(1)接口中的變量默認使用”public static final“來修飾,即全局常量。
(2)接口中定義的方法默認使用”public abstract“來修飾,即抽象方法。

④接口是一種引用數據類型

⑤接口是對繼承的單根性擴展

⑥接口不能被實例化

⑦接口是需要被實現/繼承的,實現類/子類:必須重寫接口中的所有抽象方法,如果不能實現某方法也必須寫出一個空方法

⑧一個類可以實現多個接口,用逗號分隔
又繼承又實現時,先繼承後實現:extends關鍵字必須位於implements關鍵字之前

⑨接口可以間接繼承(實現)
一個類可以通過extends關鍵字繼承另一個(或多個)接口

7.接口與抽象類的區別

**抽象類(abstract class):**聲明方法的存在而不去實現它的類被叫做抽象類,它用於要創建一個體現某些基本行爲的類,併爲該類聲明方法。但不能在該類中實現該類的情況,不能創建abstract類的實例。然而可以創建一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造或抽象靜態方法。Abstract類的子類爲它們父類中的所有抽象方法提供實現。

**接口(interface):**是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可以通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個程序體。接口只可以定義爲static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行爲。由於有抽象類,它允許使用接口名作爲引用變量的類型。

(1)接口只有定義,其方法不能在接口中實現,只有實現接口的類才能實現接口中定義的方法,而抽象類可以有定義與實現,即其方法可以在抽象類中被實現。

(2)接口只能包含抽象方法,抽象類則可以包含普通方法和抽象方法。

(3)接口不包含構造方法,抽象類裏可以包含構造方法。
(抽象類裏的構造方法並不是用於創建對象,而是讓其子類調用這些構造方法來完成屬於抽象類的初始化操作)

(4)接口需要實現(implements),但抽象類只能被繼承(extends)。一個類可以實現多個接口,但一個類只能繼承一個抽象類,因此使用接口可以間接的達到多重繼承的目的。

(5)接口強調特定功能的實現,其設計理念是“like-a”關係;而抽象類強調所屬關係,其設計理念爲“is-a”關係。

(6)接口中定義的成員變量默認爲public static final,只能夠有靜態的不能被修改的數據成員,而且,必須給其賦初始值,其所有成員方法都是public、abstract的,而且只能被這倆關鍵字修飾。而抽象類可以有自己的數據成員變量,也可以有非抽象的成員方法,而且,抽象類中的成員變量默認爲default(本包可見),也可以定義爲private、protected和public,這些成員變量可以在子類中被重新定義,也可以被重新賦值,抽象類中的抽象方法(其前有abstract修飾)不能用private、static、synchronized、native等訪問修飾符修飾,同時方法必須以分號結尾,並且不帶花括號。 所以,當功能需要累積時,用抽象類;不需要累積時,用接口。

(7)接口被用於實現比較常用的功能,便於日後維護或者添加刪除方法;而抽象類更傾向於充當公共的角色,不適用於日後重新對裏面的代碼進行修改。

(8)抽象類可以聲明和使用字段,接口不能,但可以創建靜態的final常量。

簡單來說,接口是一種特殊形式的抽象類,使用接口完全有可能實現與抽象類相同的操作,但一般而言抽象類多用於在同類事物中有無法具體描述的方法的場景,所以當子類和父類之間存在有邏輯上的層次結構時,推薦使用抽象類;而接口多用於不同類之間,定義不同類之間的通信規則,所以當希望支持差別較大的兩個或者更多對象之間的特定交互時,應該使用接口。此外,接口可以繼承接口,抽象類可以實現接口,抽象類也可以繼承具體類。抽象類也可以有靜態的main方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章