標籤:許可權 強制 代碼 區分 無法 null 指標 相關 擴充 檔案名稱
Java 繼承
繼承的概念
繼承是java物件導向編程技術的一塊基石,因為它允許建立分等級層次的類。
繼承就是子類繼承父類的特徵和行為,使得子類具有父類的各種屬性和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
繼承的特性
1.子類擁有父類非private的屬性,方法和構造器。
2.子類可以擁有自己的屬性和方法,即子類可以對父類進行擴充。
3.子類可以用自己的方式實現父類的方法。
4.Java的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關係就是C類是B類的父類,B類是A類的父類,這是java繼承區別於C++繼承的一個特性。
5.提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯絡)。
Java 重寫(Override)與重載(Overload)
重寫(Override)
重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 傳回值和形參都不能改變。即外殼不變,核心重寫!
重寫的好處在於子類可以根據需要,定義特定於自己的行為。 也就是說子類能夠根據需要實現父類的方法。
重寫方法不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的異常。例如: 父類的一個方法申明了一個檢查異常 IOException,但是在重寫這個方法的時候不能拋出 Exception 異常,因為 Exception 是 IOException 的父類,只能拋出 IOException 的子類異常。
在物件導向原則裡,重寫意味著可以重寫任何現有方法。
方法的重寫規則
1.參數列表必須完全與被重寫方法的相同;
2.傳回型別必須完全與被重寫方法的傳回型別相同;
3.存取權限不能比父類中被重寫的方法的存取權限更低。例如:如果父類的一個方法被聲明為public,那麼在子類中重寫該方法就不能聲明為protected。
4.父類的成員方法只能被它的子類重寫。
5.聲明為final的方法不能被重寫。
6.聲明為static的方法不能被重寫,但是能夠被再次聲明。
7.子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了聲明為private和final的方法。
8.子類和父類不在同一個包中,那麼子類只能夠重寫父類的聲明為public和protected的非final方法。
9.重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
10.構造方法不能被重寫。
11.如果不能繼承一個方法,則不能重寫這個方法。
重載(Overload)
重載(overloading) 是在一個類裡面,方法名字相同,而參數不同。傳回型別可以相同也可以不同。
每個重載的方法(或者建構函式)都必須有一個獨一無二的參數類型列表。
只能重載建構函式
重載規則
1.被重載的方法必須改變參數列表(參數個數或類型或順序不一樣);
2.被重載的方法可以改變傳回型別;
3.被重載的方法可以改變存取修飾詞;
4.被重載的方法可以聲明新的或更廣的檢查異常;
5.方法能夠在同一個類中或者在一個子類中被重載。
6.無法以傳回值類型作為重載函數的區分標準。
方法的重寫(Overriding)和重載(Overloading)是java多態性的不同表現,重寫是父類與子類之間多態性的一種表現,重載是一類中多態性的一種表現。
Java 多態
多態是同一個行為具有多個不同表現形式或形態的能力。
多態就是同一個介面,使用不同的執行個體而執行不同操作。
多態的實現方式
方式一:重寫:
這個內容已經在上一章節詳細講過,就不再闡述,詳細可訪問:Java 重寫(Override)與重載(Overload)。
方式二:介面
生活中的介面最具代表性的就是插座,例如一個三接頭的插頭都能接在三孔插座中,因為這個是每個國家都有各自規定的介面規則,有可能到國外就不行,那是因為國外自己定義的介面類型。
java中的介面類似於生活中的介面,就是一些方法特徵的集合,但沒有方法的實現。具體可以看 java介面 這一章節的內容。
方式三:抽象類別和抽象方法
Java 抽象類別
在物件導向的概念中,所有的對象都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的資訊來描繪一個具體的對象,這樣的類就是抽象類別。
抽象類別除了不能執行個體化對象之外,類的其它功能依然存在,成員變數、成員方法和構造方法的訪問方式和普通類一樣。
由於抽象類別不能執行個體化對象,所以抽象類別必須被繼承,才能被使用。也是因為這個原因,通常在設計階段決定要不要設計抽象類別。
父類包含了子類集合的常見的方法,但是由於父類本身是抽象的,所以不能使用這些方法。
在Java中抽象類別表示的是一種繼承關係,一個類只能繼承一個抽象類別,而一個類卻可以實現多個介面。
抽象方法
如果你想設計這樣一個類,該類包含一個特別的成員方法,該方法的具體實現由它的子類確定,那麼你可以在父類中聲明該方法為抽象方法。
Abstract關鍵字同樣可以用來聲明抽象方法,抽象方法只包含一個方法名,而沒有方法體。
抽象方法沒有定義,方法名後面直接跟一個分號,而不是花括弧。
聲明抽象方法會造成以下兩個結果:
1.如果一個類包含抽象方法,那麼該類必須是抽象類別。
2.任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類別。
繼承抽象方法的子類必須重寫該方法。否則,該子類也必須聲明為抽象類別。最終,必須有子類實現該抽象方法,否則,從最初的父類到最終的子類都不能用來執行個體化對象。
抽象類別總結
抽象類別不能被執行個體化(初學者很容易犯的錯),如果被執行個體化,就會報錯,編譯無法通過。只有抽象類別的非抽象子類可以建立對象。
抽象類別中不一定包含抽象方法,但是有抽象方法的類必定是抽象類別。
抽象類別中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。
構造方法,類方法(用static修飾的方法)不能聲明為抽象方法。
抽象類別的子類必須給出抽象類別中的抽象方法的具體實現,除非該子類也是抽象類別。
Java 封裝
在物件導向程式設計方法中,封裝(英語:Encapsulation)是指,一種將抽象性函式介面的實作細節部份封裝、隱藏起來的方法。
封裝可以被認為是一個保護屏障,防止該類的代碼和資料被外部類定義的代碼隨機訪問。
要訪問該類的代碼和資料,必須通過嚴格的介面控制。
封裝最主要的功能在於我們能修改自己的實現代碼,而不用修改那些調用我們代碼的程式片段。
適當的封裝可以讓程式碼更容易理解與維護,也加強了程式碼的安全性。
封裝的優點
良好的封裝能夠減少耦合。
類內部的結構可以自由修改。
可以對成員變數進行更精確的控制。
隱藏資訊,實現細節。
Java 介面
介面(英文:Interface),在JAVA程式設計語言中是一個抽象類別型,是抽象方法的集合,介面通常以interface來聲明。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。
介面並不是類,編寫介面的方式和類很相似,但是它們屬於不同的概念。類描述對象的屬性和方法。介面則包含類要實現的方法。
除非實現介面的類是抽象類別,否則該類要定義介面中的所有方法。
介面無法被執行個體化,但是可以被實現。一個實現介面的類,必須實現介面內所描述的所有方法,否則就必須聲明為抽象類別。另外,在 Java 中,介面類型可用來聲明一個變數,他們可以成為一個null 指標,或是被綁定在一個以此介面實現的對象。
介面與類相似點:
一個介面可以有多個方法。
介面檔案儲存在 .java 結尾的檔案中,檔案名稱使用介面名。
介面的位元組碼檔案儲存在 .class 結尾的檔案中。
介面相應的位元組碼檔案必須在與包名稱相匹配的目錄結構中。
介面與類的區別:
介面不能用於執行個體化對象。
介面沒有構造方法。
介面中所有的方法必須是抽象方法。
介面不能包含成員變數,除了 static 和 final 變數。
介面不是被類繼承了,而是要被類實現。
介面支援多重繼承。
介面特性
介面中每一個方法也是隱式抽象的,介面中的方法會被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會報錯)。
介面中可以含有變數,但是介面中的變數會被隱式的指定為 public static final 變數(並且只能是 public,用 private 修飾會報編譯錯誤。
介面中的方法是不能在介面中實現的,只能由實現介面的類來實現介面中的方法。
抽象類別和介面的區別
抽象類別中的方法可以有方法體,就是能實現方法的具體功能,但是介面中的方法不行。
抽象類別中的成員變數可以是各種類型的,而介面中的成員變數只能是 public static final 類型的。
介面中不能還有靜態代碼塊以及靜態方法(用 static 修飾的方法),而抽象類別是可以有靜態代碼塊和靜態方法。
一個類只能繼承一個抽象類別,而一個類卻可以實現多個介面。
Java 包(package)
為了更好地組織類,Java 提供了包機制,用於區別類名的命名空間。
包的作用
1、把功能相似或相關的類或介面組織在同一個包中,方便類的尋找和使用。
2、如同檔案夾一樣,包也採用了樹形目錄的儲存方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,包可以避免名字衝突。
3、包也限定了存取權限,擁有包存取權限的類才能訪問某個包中的類。
Java 使用包(package)這種機制是為了防止命名衝突,存取控制,提供搜尋和定位類(class)、介面、枚舉(enumerations)和注釋(annotation)等。
java物件導向