Java 三大特性、五大原則


java的三大特性

Java語言的三大特性即是:封裝、繼承、多態

首先先簡單的說一下其3大特性的定義:

封裝:隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別。將抽象得到的數據和行為(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行有機的結合,形成“類”,其中數據和函數都是類的成員。封裝的目的是增強安全性和簡化編程,使用者不必了解具體的實現細節,而只是要通過外部接口,一特定的訪問權限來使用類的成員。封裝的基本要求是: 把所有的屬性私有化,對每個屬性提供getter和setter方法,如果有一個帶參的構造函數的話,那一定要寫一個不帶參的構造函數。在開發的時候經常要對已經編寫的類進行測試,所以在有的時候還有重寫toString方法,但這不是必須的。

 

繼承:通過繼承實現代碼復用。Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的。繼承而得到的類稱為子類,被繼承的類稱為父類。子類不能繼承父類中訪問權限為private的成員變量和方法。子類可以重寫父類的方法,及命名與父類同名的成員變量。但Java不支持多重繼承,即一個類從多個超類派生的能力。在開發中盡量減少繼承關系,這樣做是為了把程序的耦合度降低。

 

多態:多態又分為設計時多態和運行時多態,例如重載又被稱為設計時多態,而對於覆蓋或繼承的方法,JAVA運行時系統根據調用該方法的實例的類型來決定選擇調用哪個方法則被稱為運行時多態。總而言之,面向對象的設計的典型特點就是繼承,封裝和多態,這些特點也是面向對象之所以能如此盛行的關鍵所在。

 

以上就是java三大特性的基本含義,大家理解一下就行了,千萬別背啊!接下來我們通過一個例子來完美的解釋一下java的3大特性。

用java做一個簡單計算器;

import java.io.*;

class OperationAttridute

{

       private double numberA=0;

       private double numberB=0;

       private double result=0;

       public double setNumberA(double i)

       {

              return numberA=i;

       }

       public double getNumberA()

       {

              return numberA;

       }

       public double setNumberB(double j)

       {

              return numberB=j;

       }

       public double getNumberB()

       {

              return numberB;

       }

       public double setResult(double z)

       {

              return result=z;

       }

       public double getResult(double a,double b)

       {

              return result;

       }

}

//將要運算的2個數字和運算結果進行封裝。

class OperationA extends OperationAttridute

{    

       public double getResult(double a,double b)

       {

              double result=0;

              result=a+b;

              return result;

       }    

}

//加法類:繼承OperationAttridute類並且覆蓋其getResult方法

class OperationS extends OperationAttridute

{

       public double getResult(double a,double b)

       {

              double result=0;

              result=a-b;

              return result;

       }

}

//減法類:繼承OperationAttridute類並且覆蓋其getResult方法

class OperationM extends OperationAttridute

{

       public double getResult(double a,double b)

       {

              double result=0;

              result=a*b;

              return result;

       }

}

//乘法類:繼承OperationAttridute類並且覆蓋其getResult方法

class OperationD extends OperationAttridute

{

       public double getResult(double a,double b)

       {

              double result=0;

              if(b==0)

              {

                     Throw new RuntimeException(“被除數不能為0”);

              }

              result=a/b;

              return result;

       }

}

//除法類:繼承OperationAttridute類並且覆蓋其getResult方法,除法要對被除數進行判斷並拋出異常

class Operationdo

{

       public static Object expression_r(char r)

       {

              OperationAttridute oa=new OperationAttridute();       

              switch(r)

              {

                     case '+':

                     oa=new OperationA();                

                     break;

                     case '-':

                     oa=new OperationS();                 

                     break;

                     case '*':

                     oa=new OperationM();         

                     break;

                     case '/':

                     oa=new OperationD();         

                     break;                  

              }

              return oa;             

       }

}

//運算類:通過傳進來的參數,來調用運算方法

class Account

{

       public static void main(String []args)throws Exception

       {

              char r='*';                   

              OperationAttridute oa=(OperationAttridute)Operationdo.expression_r(r);

              double a=oa.setNumberA(9);

              double b=oa.setNumberB(2);

              System.out.println(oa.getResult(a,b));  

       }

}

//主程序

這樣,只需要輸入運算符號,通過多態,返回父類的方式實現了計算器的結果。

 

 

JAVA設計模式五大原則

1、單一職責

不論是在設計類,接口還是方法,單一職責都會處處體現,單一職責的定義:我們把職責定義為系統變化的原因。所有在定義類,接口,方法的時候。定義完以后再去想一想是不能多於一個的動機去改變這個類,接口,方法。如果答案是肯定的,說明定義的類,接口,方法則多於一個職責。故違背單一職責,遇到這種情況應該重新細分職責,直到不會出現多種職責的類,接口方法為止(發現職責,並把那些職責相互分離)。單一職責的為最簡單的五種原則之一。在軟件設計的過程中處處體現。無處不在。

2、開閉原則

開閉原則是指類、模塊、方法是可以擴展的,但不可以修改。開即對擴張開放,閉即對修改關閉。開閉原則的應用體現在,開發人員應該僅僅對程序中頻繁出現變化的地方進行抽象(封裝變化點)。對變化點的封裝即對變化的修改關閉。對於變化的不確定性,可隨時擴展。即 繼承的使用。抽象類的運用。

3、替換原則(Is-A)

替換原則即是總是保證子類可以替換它的基類。

替換原則的實現。對於一組具有類似屬性,方法,變量的類。我們可以提取公共屬性,方法,變量做為一個基類(抽象類或者類),使這一組類繼承基類,重寫虛方法。現在這些繼承的類和基類的關系符合Is-A。如基類為鳥,則繼承類可以為麻雀,燕子。我們可以說麻雀Is-A鳥,燕子Is-A鳥。

在項目中所有使用子類的地方都可用父類替換,但在調用方法的時候 ,即呈現面向對象編程的多態性。即替換原則,非常重要的原則,也是比較對難的原則。

4、依賴倒置原則

a、高層模塊不應該依賴於低層模塊。二者都應該依賴於抽象

b、抽象不應該依賴於細節。細節應該依賴於抽象。

在面向過程的開發語言中分析和設計,總是創建一些高層模塊去調用低層模塊、策略依賴於細節的軟件結構。實際上這種方法的目的就是要定義子程序層次結構,該結構 描述了高層模塊怎樣調用低層模塊。而設計良好的面向對象的程序,正好“倒置”了這種依賴關系。高層模塊不再依賴於低層模塊,從而低層模塊的修改不會影響到高層模塊,並且高層模塊也是能非常容易的被重用,高層模塊和低層模塊都影響都依賴於抽象。這樣也非常符合強內聚松耦合的編程思想。故該原則也是框架設計的核心原則。

使用傳統的過程化程序設計所創建出來的依賴關系結構,策略是依賴於細節的,這是糟糕的,因為這樣會使策略受到細節改變的影響,面向對象的程序設計倒置了依賴關系結構,全程細節和策略都依賴抽象,並且常常是客戶程序擁有服務接口。

事實上,這種依賴關系的倒置正是好的面向對象設計 的標志所在,使用何種語言來編寫程序是無關緊要的。如果程序的依賴關系是倒置的,它就是面向對象的設計。如果程序的依賴關系不是倒置的,它就是過程化的設計。

依賴倒置原則是實現許多面向對象技術所宣稱的好處的基本低層機制。它的正確應用對於創建可重用的框架來說是必需的。同時它對於構建在變化面前富有彈性的代碼也是非常重要的,由於抽象和細節彼此隔離,所以代碼也非常容易維護。

5、接口隔離原則

應該說該原則是處理現有“胖”接口所存在的缺點。如果類的接口不是內聚的,就表示該類具有“胖”接口。換句話說“胖”接口可以分解成多組方法。每一組方法都服務於一組不同的客戶程序。這樣,量引客戶程序可以使用一組成員函數,而其他客戶程序可以使用其他組的成員函數。

接口隔離的方法有兩種(分享客戶就是分離接口):

1、使用委托(此委托非.net委托[delegate])分離接口

使用委托即,創建一個委托類,用此類去實現分離后的其它接口中的方法。

2、使用多重繼承分離接口、

此方法,即將現有“胖”接口分成供不同客戶程序調用的兩個或多個接口,而需要實現多個接口的客戶程序,則使用多重繼承來實現。

這兩種方法是實現接口隔離的全部方法,其中第二種方法使用較普遍,也比較簡單。而第一種方法使用起來相對比較復雜,而且在使用委托的過程中也會產生重復的對象,則占用運行時間和內存開銷。有的時候第二種方法是必須的,第一種方法是不能使用的。如:利用委托對象所做的轉換是必需的,或者不同的時候會需要不同的轉換。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM