Java面向對象概述和三大特性

Java 是面向對象的高級編程語言,類和對象是 Java 程序的構成核心。圍繞着 Java 類和 Java 對象,有三大基本特性:封裝是 Java 類的編寫規範、繼承是類與類之間聯繫的一種形式、而多態爲系統組件或模塊之間解耦提供瞭解決方案。程序員

 

  本文主要圍繞這三大特性介紹一下 Java 面向對象、組件解耦的核心思想。編程

 

一、面向對象思想

  面向對象編程是當今主流的程序設計思想,已經取代了過程化程序開發技術,Java 是徹底面向對象編程語言,因此必須熟悉面向對象纔可以編寫 Java 程序。安全

  面向對象的程序核心是由對象組成的,每一個對象包含着對用戶公開的特定功能和隱藏的實現部分。程序中的不少對象來自 JDK 標準庫,而更多的類須要咱們程序員自定義。框架

  從理論上講,只要對象可以實現業務功能,其具體的實現細節沒必要特別關心。編程語言

  面向對象有如下特色:學習

  (1)面向對象是一種常見的思想,比較符合人們的思考習慣;spa

  (2)面向對象能夠將複雜的業務邏輯簡單化,加強代碼複用性;設計

  (3)面向對象具備抽象、封裝、繼承、多態等特性。code

  面向對象的編程語言主要有:C++、Java、C#等。對象

 

二、類和對象的關係

  類:

  對某類事物的廣泛一致性特徵、功能的抽象、描述和封裝,是構造對象的模版或藍圖,用 Java 編寫的代碼都會在某些類的內部。類之間主要有:依賴、聚合、繼承等關係。

 

  對象:

  使用 new 關鍵字或反射技術建立的某個類的實例。同一個類的全部對象,都具備類似的數據(好比人的年齡、性別)和行爲(好比人的吃飯、睡覺),可是每一個對象都保存着本身獨特的狀態,對象狀態會隨着程序的運行而發生改變,須要注意狀態的變化必須經過調用方法來改變,這就是封裝的基本原則。

 

三、封裝思想

  核心思想就是「隱藏細節」、「數據安全」:將對象不須要讓外界訪問的成員變量和方法私有化,只提供符合開發者意願的公有方法來訪問這些數據和邏輯,保證了數據的安全和程序的穩定。

  具體的實現方式就是:

  使用 private 修飾符把成員變量設置爲私有,防止外部程序直接隨意調用或修改爲員變量,而後對外提供 public 的 set 和 get 方法按照開發者的意願(能夠編寫一些業務邏輯代碼,雖然不多這樣作)設置和獲取成員變量的值。

  也能夠把只在本類內部使用的方法使用 private,這就是封裝的思想,是面向對象最基本的開發規範之一。

 

  在此,咱們有必要說一下 Java 的訪問權限修飾關鍵字。Java 中主要有 private、protected、public 和 默認訪問權限 四種:

  public 修飾符,具備最大的訪問權限,能夠訪問任何一個在 CLASSPATH 下的類、接口、異常等。

  protected 修飾符,主要做用就是用來保護子類,子類能夠訪問這些成員變量和方法,其他類不能夠。

  default 修飾符,主要是本包的類能夠訪問。

  private 修飾符,訪問權限僅限於本類內部,在實際開發過程當中,大多數的成員變量和方法都是使用 private 修飾的。

 

  

 

  Java 的訪問控制是停留在編譯層的,只在編譯時進行訪問權限檢查,不會在類文件中留下痕跡。

  經過反射機制,仍是能夠訪問類的私有成員的。

 

   咱們舉個小例子:

  View Code

 

   在實際的開發過程當中,這樣的封裝方式已經成了 Java Bean 代碼編寫的規範。如今主流的框架在使用反射技術爲對象賦值、取值時使用的都是 set 和 get 方法,而不是直接操做字段的值。

 

四、繼承和類實例化過程

  (1)在多個不一樣的類中抽取出共性的數據和邏輯,對這些共性的內容進行封裝一個新的類即父類(也叫作超類或基類),讓以前的類來繼承這個類,那些共性的內容在子類中就沒必要重複定義,好比 BaseDAO、BaseAction 等。

  * (2)Java 的繼承機制是單繼承,即一個類只能有一個直接父類。

  * (3)若是子類和父類有同名成員變量和方法,子類可使用 super 關鍵字調用父類的成員變量和方法,上述使用方式前提是成員在子類可見。

  * (4)在調用子類構造方法時,會隱式的調用父類的構造方法 super()。若是父類沒有無參構造方法,爲了不編譯錯誤,須要在子類構造方法中顯式的調用父類的含參構造方法。

  (5)子類建立時調用父類構造方法:子類須要使用父類的成員變量和方法,因此就要調用父類構造方法來初始化,以後再進行子類成員變量和方法的初始化。所以,構造方法是沒法覆蓋的。

  * (6)當子類須要擴展父類的某個方法時,能夠覆蓋父類方法,可是子類方法訪問權限必須大於或等於父類權限。

  (7)繼承提升了程序的複用性、擴展性,也是 Java 語言多態特徵的前提。

  (8)在實際開發、程序設計過程當中,並不是先有的父類,而是先有了子類中通用的數據和邏輯,而後再抽取封裝出來的父類。

 

  咱們簡單瞭解下類的實例化過程

  (1)JVM 讀取指定 classpath 路徑下的 class 文件,加載到內存,若是有直接父類,也會加載父類;

  (2)堆內存分配空間;

  (3)執行父類、子類靜態代碼塊;

  (4)對象屬性進行默認初始化;

  (5)調用構造方法;

  (6)在構造方法中,先調用父類構造方法初始化父類數據;

  (7)初始化父類數據後,顯示初始化,執行子類的構造代碼塊;

  (8)再進行子類構造方法的特定初始化;

  (9)初始化完畢後,將地址賦值給引用

 

  爲了說明上面的內容,咱們來編寫一個簡單的例子,實際意義並不大,只是爲了演示類繼承實例化的過程。

 

  View Code

 

五、多態、反射和組件解耦

  多態指容許不一樣類的對象對同一「消息」作出響應。即同一消息能夠根據發送對象的不一樣而採用多種不一樣的行爲方式。能夠用於消除類型之間的耦合關係,Spring 的核心就是多態和麪向接口編程。

  (1)Java 中可使用父類、接口變量引用子類、實現類對象;

  (2)在這個過程當中,會對子類、實現類對象作自動類型提高,其特有功能就沒法訪問了,若是須要使用,能夠作強制類型轉換。

 

  Java 的反射技術和多態特性是框架開發、組件解耦的核心,在這方面,Spring 的 IOC 和 DI 爲咱們提供了一個極好的學習範例,Spring 的 IOC 使用反射技術建立、管理對象,DI 使用多態技術爲組件注入依賴對象。

 

  在沒有學習 Spring 以前,簡單的解決方案是使用一個 .properties 文件保存程序中使用的接口、實現類類型鍵值信息,而後在程序中使用一個全局 Properties 對象保存這些信息,而且使用反射技術把這些實現類初始化、提供一個靜態的方法獲取指定接口的實現類對象,在組件中就可使用依賴對象的鍵獲取須要的對象。

  這樣的方案帶來的好處就是:當咱們須要修改某個組件的實現方式時,好比把以前 JDBC 的 DAO 實現改成 Hibernate 實現,只要把這些新的實現類放到 classpath 下,把 .properties 文件對應接口的實現類類型改爲新的 Hibernate 實現類,而不須要修改依賴組件的代碼。

  在以後的文章中,咱們將寫一個簡單的例子進一步講解這個初級解耦方案。

相關文章
相關標籤/搜索