一、抽象
抽象是從具體事物抽出、概括出它們共同的方面、本質屬性與關系等,而將個別的、非本質的方面、屬性與關系舍棄。抽象是Java面向對象編程的核心原則,出現在抽象類(abstract)和接口(interfaces)中
抽象類的特點:
1.抽象方法一定在抽象類中;
2.抽象方法和抽象類都必須被abstract關鍵字修飾;
3.抽象類不可以用new創建和實例化對象,因為抽象類本事就是不完整的,抽象方法只定義,未實現功能;
4.抽象類中的方法要被使用,必須有子類重寫所有的抽象方法后,建立子類對象的調用,如果子類未重寫全部的抽象方法,那些該子類還是一個抽象類。
Abstract關鍵字,不能和以下關鍵字共存:
1.final :被final修飾的類不能有子類,即不能被繼承。而abstract修飾的類一定是一個父類,只能被繼承。
2.private :抽象類中的私有方法的抽象方法,不能被子類所知,就無法被繼承。
3.Static : 如果static可以修飾抽象方法,那么連對象都省了,直接類名調用就可以了。 可是抽象方法運行沒意義。
接口:Java接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
接口中可以含有 變量和方法。但是要注意,接口中的變量會被隱式地指定為public static final變量(並且只能是public static final變量,用private修飾會報編譯錯誤),而方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤),並且接口中所有的方法不能有具體的實現,也就是說,接口中的方法必須都是抽象方法。從這里可以隱約看出接口和抽象類的區別,接口是一種極度抽象的類型,它比抽象類更加“抽象”,並且一般情況下不在接口中定義變量。
接口的特點:
1、個Interface的方所有法訪問權限自動被聲明為public。確切的說只能為public,當然你可以顯示的聲明為protected、private,但是編譯會出錯!
2、接口中可以定義“成員變量”,或者說是不可變的常量,因為接口中的“成員變量”會自動變為為public static final。可以通過類命名直接訪問:ImplementClass.name。
3、接口中不存在實現的方法。
4、實現接口的非抽象類必須要實現該接口的所有方法。抽象類可以不用實現。
5、不能使用new操作符實例化一個接口,但可以聲明一個接口變量,該變量必須引用(refer to)一個實現該接口的類的對象。可以使用 instanceof 檢查一個對象是否實現了某個特定的接口。例如:if(anObject instanceof Comparable){}。
6、在實現多接口的時候一定要避免方法名的重復。
二、封裝
封裝(Encapsulation)是面向對象方法的重要原則,就是把對象的屬性和操作(或服務)結合為一個獨立的整體,並盡可能隱藏對象的內部實現細節。封裝可以把一個對象的屬性私有,而提供一些可以被外界訪問的屬性的方法。簡而言之,就是隱藏對象信息,流出訪問接口。
封裝的作用:
1、對象的數據封裝特性徹底消除了傳統結構方法中數據與操作分離所帶來的種種問題,提高了程序的可復用性和可維護性,降低了程序員保持數據與操作內容的負擔。
2、對象的數據封裝特性還可以把對象的私有數據和公共數據分離開,保護了私有數據,減少了可能的模塊間干擾,達到降低程序復雜性、提高可控性的目的。
代碼的實現,屬性前+private。創建Get和Set方法提供外部使用。
public class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
三、繼承
繼承是面向對象最顯著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,並能擴展新的能力。
語法為:
class 子類 extends 父類 {}
* 繼承中的初始化順序:
從類的結構上而言,其內部可以有如下四種常見形態:屬性(包括類屬性和實例屬性)、方法(包括類方法和實例方法)、構造器和初始化代碼塊(包括類的初始化塊和實例的初始化塊)。對於繼承中的初始化順序,又具體分為類的初始化和對象的初始化。
類初始化:
在jvm裝載類的准備階段,首先為類的所有類屬性和類初始化塊分配內存空間。並在類首次初始化階段中為其進行初始化,類屬性和類初始化塊之間的定義時的順序決定了其初始化的順序。若類存在父類,則首先初始化父類的類屬性和類初始化塊,一直上溯到Object類最先執行。
對象初始化:
在new創建對象時,首先對對象屬性和初始化塊分配內存,並執行默認初始化。如果存在父類,則先為父類對象屬和初始化塊先分配內存並執行初始化。然后執行父類構造器中的初始化程序,接着才開始對子類的對象屬性和初始化塊執行初始化。
注:
1. 在對象初始化階段,屬性和方法均針對子類可以從父類繼承過來的屬性和方法而言,一般而言,都是針對父類中非private而言的。因為private修飾的為父類所特有的,子類沒有繼承過來,當new子類時,無須為其分配空間並執行初始化。當然了,父類的構造器子類也是不繼承過來的,但構造器另當別論。
2.類的初始化只執行一次,當對同一個類new多個對象時,類屬性和類初始化塊只初始化一次。
繼承中的this和super:
構造器中的this表示當前正在初始化的對象引用,方法中的this表示當前正在調用此方法的對象引用。this具體用法表現在一下幾個方面:
1.當具多個重載的構造器時,且一個構造器需要調用另外一個構造其,在其第一行使用this(param)形式調用,且只能在第一行;
2.當對象中一個方法需要調用本對象中其他方法時,使用this作為主調,也可以不寫,實際上默認就是this作為主調;
3.當對象屬性和方法中的局部變量名稱相同時,在該方法中需要顯式的使用this作為主調,以表示對象的屬性,若不存在此問題,可以不顯式的寫this。其實,其牽涉到的一個問題就是變量的查找規則:先局部變量 => 當前類中定義的變量 => 其父類中定義的可以被子類繼承的變量 => 父類...
super表示調用父類中相應的屬性和方法。在方法中,若需要調用父類的方法時,也一定要寫在第一行。
四、多態
多態的定義: 指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而采 用多種不同的行為方式。 程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編譯時並不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。
多態的作用:消除類型之間的耦合關系
實現多態有三個必要條件: 1.繼承 2.重寫 3.向上轉型
指向子類的父類引用由於向上轉型了,它只能訪問父類中擁有的方法和屬性,而對於子 類中存在而父類中不存在的方法,該引用是不能使用的,盡管是重載該方法。若子類重寫了父 類中的某些方法,在調用該些方法的時候,必定是使用子類中定義的這些方法(動態連接,動態 調用)
多態的優點:
1.可替換性(substitutability)。多態對已存在代碼具有可替換性。
2.可擴充性(extensibility)。多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態功能。
3.接口性(interface-ability)。多態是超類通過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。
4.靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。
5.簡化性(simplicity)。多態簡化對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。