1. 程式人生 > >程式設計體系結構(06):Java面向物件

程式設計體系結構(06):Java面向物件

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile) || [GitEE·點這裡](https://gitee.com/cicadasmile) # 一、基礎概念 **1、面向物件概念** 面向物件程式設計的主要思想是把構成問題的各個事務分解成各個物件,建立物件的目的不是為了完成一個步驟,而是為了描敘一個事物在整個解決問題的步驟中的行為。 ![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201008182923015-1771667802.png) **2、類和物件** 物件:真實存在唯一的事物;在應用程式中物件是資料和動作的結合體,不僅能夠進行操作,同時還能夠記錄下操作結果。 類:抽象的概念,實際就是對某種型別事物的共性屬性與行為的抽取;例如User[名稱.年齡.性別]類用來描述使用者的基礎資訊。 Java開發中如何理解面向物件:構建合適的物件介面API體系,建立合適的物件,解決合適的問題,例如JDK的API已經定義好的類,通過這些類建立物件直接使用;通過自定義類來建立物件使用,在MVC中模式中,不同業務功能建立不同的介面和類系統。 **3、屬性和方法** **類中變數** 位置區別: - 成員變數是定義在方法之外,類內; - 區域性變數是定義在方法之內。 作用區別: - 成員變數的作用是用於描述一類事物的公共屬性的。 - 區域性變數的作用就是提供一個變數給方法內部使用而已。 初始值區別: - 成員變數是有預設的初始值。 - 區域性變數是沒有預設的初始值的,必須要先初始化才能使用。 生命週期: - 隨著物件的建立而存在,隨著物件的消失而消失。 - 區域性變數在呼叫了對應的方法時執行到了建立該變數的語句時存在,區域性變數一旦出了自己的作用域那麼馬上從記憶體中消失。 **類中方法** 對一個類功能的具體描述,可能是類方法或者物件方法; - 類方法,又叫靜態方法,使用類直接呼叫,常用工具類; - 物件方法,又叫例項方法,使用類物件呼叫,常見API方法; **構造方法** 建構函式的作用是用來給對應的物件進行初始化處理,沒有返回值型別的,建構函式的函式名必須要與類名一致,如果一個類沒有顯式的宣告一個構造方法,那麼java編譯器會為該類新增一個無參的建構函式的,如果一個類已經顯式的寫上一個構造方法時,那麼java編譯器則不會再為該類新增一個無參的構造方法,建構函式是可以在一個類中以過載的形式存在多個。 **4、介面** 介面是一個特殊的類,介面的成員變數預設的修飾符為:public-static-final,介面中的方法都是抽象的方法,預設的修飾符:public-abstract,介面不能建立物件且沒有構造方法的,介面是給類去實現時使用的,非抽象類實現介面,必須要把介面中所有方法全部實現。 介面的作用:程式的解耦,定義實現類的約束規範,如果需要拓展特別功能,也可以基於介面形式實現。 類與介面之間關係:多實現關係;介面與介面之間關係:多繼承關係。 **5、過載與重寫** **方法重寫** 父類的功能無法滿足子類的需求時,可以進行方法的重寫即子父類使用同名的函式,且子類重寫的方法使用@Override註解,這裡存在繼承的關係。 - 方法名與形參列表必須一致; - 子類的許可權修飾符必須要大於或者等於父類的許可權修飾符; - 子類的返回值型別必須要小於或者等於父類的返回值型別; - 子類丟擲的異常型別要小於或者等於父類丟擲的異常型別; **方法過載** 在一個類中存在兩個或者兩個以上的同名函式,稱作為方法過載,函式名要一致,形參列表不一致(形參的個數或形參的型別不一致)。 **6、包與許可權** **許可權修飾符** 許可權修飾符就是控制被修飾的成員的範圍可見性,分為:public、private、protected、default(沒有修飾)。在不同包下面只有public 與 protected 可以訪問,而且protected必須是在繼承關係下才能夠訪問。 **包package** 包可以理解為計算機系統中的資料夾,用來解決類名重複產生衝突的問題,包名全部小寫,語句必須位於java檔案中中第一個語句。 # 二、基本特徵 **封裝** 把類中內部的實現細節進行隱藏,只暴露對外的介面,例如實際開發場景中一般實體類的所有成員屬性(成員變數)都要封裝起來,可以被認為是一個保護屏障,防止該類的程式碼和資料被外部類定義的程式碼隨機訪問,適當的封裝可以讓程式程式碼更容易理解與維護,加強安全性。 **繼承** 在現有父類的基礎上在重新構建一個新類即子類,通過子類物件可以訪問父類非私有的成員變數和成員方法,以及重寫父類中的非私有成員方法,繼承的作用就是能提高程式碼的複用性。 **多型** 多型指一個物件可以具備多種形態,例如:父類的引用型別變數指向了子類的物件;介面的引用型別變數指向了介面實現類的物件;這種情況是存在於繼承或者實現關係中,多型情況下,子父類存在同名的成員變數時,訪問的都是父類的成員,除了在同名非靜態函式時才是訪問子類的。 # 三、常用關鍵字 **1、This關鍵字** this關鍵字代表了所屬函式的呼叫者物件,如果存在同名成員變數與區域性變數時,在方法內部預設是訪問區域性變數的資料,可以通過this關鍵字指定訪問成員變數的資料,在一個建構函式中可以呼叫另外一個建構函式初始化物件。 **2、Static關鍵字** static修飾成員變數:如果有資料需要被共享給所有物件使用時,那麼就可以使用static修飾。 static修飾成員函式:該靜態方法不依賴於任何物件就可以進行訪問,非靜態成員方法/變數都必須依賴具體的物件才能夠被呼叫。 static修飾程式碼塊:static關鍵字用來包裝靜態程式碼塊以提升程式效能,靜態程式碼塊可以置於類中的任何地方,在類初次被載入的時候,會依次執行一次每個靜態程式碼塊。 **3、Super關鍵字** super關鍵字代表了父類空間的引用,子父類存在著同名的成員時,在子類中預設是訪問子類的成員,可以通過super關鍵字指定訪問父類的成員;建立子類物件時,預設會先呼叫父類無參的構造方法,可以通過super關鍵字指定呼叫父類的構造方法。 **4、Instanceof關鍵字** instanceof關鍵字的作用:判斷一個物件是否屬於指定的類別,物件與指定的類別必須要存在繼承或者實現的關係。在強制型別轉換之前通常會使用該關鍵字先判斷,然後在進行轉換。 **5、Final關鍵字** final修飾類:表明該類不能被繼承,final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。 final修飾方法:鎖定方法防止任何繼承類修改它的含義;第二個原因是效率,父類的final方法是不能被子類所覆蓋的。 final修飾變數:成員變數被標識為常量,只能被賦值一次,賦值後值不再改變,當函式的引數型別宣告為final時,說明該引數是隻讀型的。 **6、Abstract關鍵字** abstract修飾類:該抽象類不能被例項化,抽象類與介面的不同之處,介面中不能有例項方法去實現業務邏輯,而抽象類中可以有例項方法,並實現業務邏輯,抽象類不能使用final關鍵字修飾,因為final修飾的類是無法被繼承,而對於抽象類來說就是需要通過繼承去實現抽象方法。 abstract修飾方法:抽象方法沒有方法主體,與介面方法有點類似,抽象方法不能用private修飾,因為抽象方法必須被子類實現,抽象方法也不能用static修飾,抽象類.抽象方法這樣的操作沒有意義。 # 四、場景分析 **1、設計模式** 面向物件與設計模式是之前幾年很火熱的概念,面試時必問的問題,在程式設計中想用好設計模式,前提理解面向物件機制,都是對問題的高度向上抽象封裝,向下逐層解決實現,提高程式碼的複用性、可讀性、靈活性、可維護性強,最主要是格調高。 **2、IO流體系** 如果想理解面向物件和設計模式的程式碼,在Java中可以重點讀讀IO流體系的API,頂級介面,向下實現,包裝類,擴充套件類,是真的把這兩大理念用到極致了,當然IO流最為檔案處理的核心,也值得讀讀原始碼。 **3、MVC開發模式** 在MVC的開發模式中,業務層介面,業務層實現;資料庫介面,資料訪問實現,也是面向物件的最基礎用法介面與介面的實現類。 # 五、原始碼地址 ``` GitHub·地址 https://github.com/cicadasmile GitEE·地址 https://gitee.com/cicadasmile ``` **推薦閱讀:程式設計體系整理** |序號|專案名稱|GitHub地址|GitEE地址|推薦指數| |:---|:---|:---|:---|:---| |01|Java描述設計模式,演算法,資料結構|[GitHub·點這裡](https://github.com/cicadasmile/model-arithmetic-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/model-arithmetic-parent)|☆☆☆☆☆| |02|Java基礎、併發、面向物件、Web開發|[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent)|☆☆☆☆| |03|SpringCloud微服務基礎元件案例詳解|[GitHub·點這裡](https://github.com/cicadasmile/spring-cloud-base)|[GitEE·點這裡](https://gitee.com/cicadasmile/spring-cloud-base)|☆☆☆| |04|SpringCloud微服務架構實戰綜合案例|[GitHub·點這裡](https://github.com/cicadasmile/husky-spring-cloud)|[GitEE·點這裡](https://gitee.com/cicadasmile/husky-spring-cloud)|☆☆☆☆☆| |05|SpringBoot框架基礎應用入門到進階|[GitHub·點這裡](https://github.com/cicadasmile/spring-boot-base)|[GitEE·點這裡](https://gitee.com/cicadasmile/spring-boot-base)|☆☆☆☆| |06|SpringBoot框架整合開發常用中介軟體|[GitHub·點這裡](https://github.com/cicadasmile/middle-ware-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/middle-ware-parent)|☆☆☆☆☆| |07|資料管理、分散式、架構設計基礎案例|[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent)|☆☆☆☆☆| |08|大資料系列、儲存、元件、計算等框架|[GitHub·點這裡](https://github.com/cicadasmile/big-data-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/big-data-parent)|☆☆☆☆☆