java面向對象編程是指:Java語言提供類、接口和繼承等面向對象的特性,為了簡單起見,只支持類之間的單繼承,但支持接口之間的多繼承,並支持類與接口之間的實現機制(關鍵字為implements)。另外,java是面向對象,但不是所有的都是對象,基本數據類型就不是對象,所以才會有封裝類。
面向對象的特性有1)抽象,2)封裝,3)繼承,4)多態。
1)抽象
抽象類:包含抽象方法的類稱之為抽象類,但不意味着抽象類中只能有抽象方法,它和普通類一樣,可以擁有普通的成員變量、方法。
1、抽象類不能被實例化。抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。
2、 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
3、抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。
4、構造方法,類方法(用 static 修飾的方法)不能聲明為抽象方法。
5、被定義為abstract的類需要被子類繼承,但是被修飾為final的類是不能被繼承和改寫的,這兩者是不能一起用來做修飾的。
接口:接口是一種特殊的抽象類。當使用類的時候,僅關注其行為,不關心繼承時可以使用接口來代替類。接口中的方法都是抽象方法,abstract默認不寫,所以抽象類中的抽象方法不能用訪問修飾符。接口中聲明的成員默認為static final成員(不管是基礎數據類型還是引用類型),且必須初始化。
接口的特性:
1、接口中每一個方法也是隱式抽象的,接口中的方法會被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會報錯)。
2、接口中可以含有變量,但是接口中的變量會被隱式的指定為 public static final 變量(並且只能是 public,用 private 修飾會報編譯錯誤)。
3、接口中的方法是不能在接口中實現的,只能由實現接口的類來實現接口中的方法。
接口和抽象類的區別:
1、抽象類中的方法可以有方法體,但是接口中的方法不行。
2、抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是 public static final 類型的(隱式公有的)。
3、接口中不能含有靜態代碼塊以及靜態方法(用 static 修飾的方法),而抽象類是可以有靜態代碼塊和靜態方法。【JDK1.8后,接口里面可以有靜態方法和方法體了】
4、一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
5、抽象類有構造函數,而接口沒有構造函數。
2)封裝(Encapsulation):指一種將抽象性函式接口的實現細節部份包裝、隱藏起來的方法。指一種將抽象性函式接口的實現細節部份包裝、隱藏起來的方法。
3)繼承
繼承的特性:
1、子類擁有父類非 private 的屬性、方法。
2、子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。
3、子類可以用自己的方式實現父類的方法。
4、Java 的繼承是單繼承,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類,多重繼承就是,例如 A 類繼承 B 類,B 類繼承 C 類,所以按照關系就是 C 類是 B 類的父類,B 類是 A 類的父類,這是 Java 繼承區別於 C++ 繼承的一個特性。
5、提高了類之間的耦合性(繼承的缺點,耦合度高就會造成代碼之間的聯系越緊密,代碼獨立性越差)。
4)多態:將子類對象賦給父類的引用,會產生多態。
如:Father son =new Son() 【順便提一下:此時的對象son只能調用Father的方法(指的是子類重寫或者繼承父類的那些方法),而不能調用本身定義的一些方法。因為多態中強調:編寫java程序時,引用類型變量只能調用其編譯時類型的變量,不能調用其運行時類型變量。】
多態的三個必要條件:1、繼承 2、重寫 3、父類引用指向子類對象
多態的作用:
1、不必編寫每一子類的功能調用,可以直接把不同子類當父類看,屏蔽子類間的差異(也可以說隱藏了細節),提高代碼的通用率/復用率。
2、父類引用可以調用不同子類的功能,提高了代碼的擴充性和可維護性。
多態的表現形式可以是對父類的方法的重寫或重載。【重載是指一個類中可以有同樣的修飾符,返回值,方法名,但參數個數或順序不同的方法。而重寫指的是子類繼承父類后,重寫父類的方法。重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫,返回值和形參都不能改變。即外殼不變,核心重寫!】
多態的實現方式:1、重寫;2、接口;3、抽象類和抽象方法。