Java的四大面向?qū)ο缶幊谈拍?/h1>

面向?qū)ο缶幊掏ǔ1环Q為OOPS,是Java的主干栓霜,因?yàn)镴ava是一種完全面向?qū)ο蟮恼Z(yǔ)言。Java圍繞各種對(duì)象和定義良好的接口組織程序横蜒。在OOPS中有四個(gè)支柱胳蛮,如下所示。這些概念目的是在程序中實(shí)現(xiàn)真實(shí)世界的實(shí)體丛晌。

  • 抽象化
  • 封裝
  • 繼承
  • 多態(tài)

抽象是隱藏實(shí)現(xiàn)細(xì)節(jié)的過(guò)程仅炊,并且只向用戶公開功能。在抽象方面澎蛛,我們處理的是思想而不是事件抚垄。這意味著用戶只知道“它做什么”,而不知道“它是如何做的”谋逻。

在Java中有兩種實(shí)現(xiàn)抽象的方法

1.抽象類(0到100%)
2.接口(100%)

現(xiàn)實(shí)生活中的一個(gè)例子:一個(gè)司機(jī)會(huì)專注于汽車的功能(開始/停止->加速/中斷)呆馁,他/她不會(huì)對(duì)加速/制動(dòng)機(jī)制的內(nèi)部工作方式發(fā)牢騷。抽象就是這樣運(yùn)作的毁兆。

關(guān)于OOPS這一支柱浙滤,應(yīng)記住以下幾點(diǎn):

  • 如果一個(gè)類有一個(gè)或多個(gè)抽象方法,則類應(yīng)該是抽象的气堕。
  • 抽象類可以有構(gòu)造函數(shù)纺腊、具體方法、靜態(tài)方法和最終方法送巡。
  • 類不能直接實(shí)例化抽象類摹菠。 新的 接線員∑可以如下面的預(yù)標(biāo)記所示:
A b = new B();
  • 子類應(yīng)該覆蓋父類的所有抽象方法次氨,否則,應(yīng)該用抽象關(guān)鍵字聲明子類摘投。

    例子:
// Abstract class
public abstract class Car {
   public abstract void stop();
}
 
// Concrete class
public class Honda extends Car {
   // Hiding implementation details
   @Override public void stop()
   {
     System.out.println( "Honda::Stop" );
     System.out.println(
       "Mechanism to stop the car using break" );
   }
}
 
public class Main {
   public static void main(String args[])
   {
     Car obj
       = new Honda(); // Car object =>contents of Honda
     obj.stop(); // call the method
   }
}

支柱2:封裝
封裝是將代碼和數(shù)據(jù)封裝到一個(gè)單元中的過(guò)程煮寡。

真實(shí)的例子:
由幾種藥物混合而成的膠囊虹蓄。這些藥物是給最終用戶的隱藏?cái)?shù)據(jù)。

為了在java中實(shí)現(xiàn)封裝幸撕,請(qǐng)按照以下建議執(zhí)行某些步驟:

  • 將變量聲明為私有變量
  • 聲明SETETER和gettersto設(shè)置并獲取變量值

注意:在java中封裝很少有缺點(diǎn)薇组,如下所示:

1.對(duì)數(shù)據(jù)的控制:我們可以在setter方法中寫入邏輯,以避免存儲(chǔ)整數(shù)的負(fù)值坐儿。這樣我們就可以控制數(shù)據(jù)律胀。
2.數(shù)據(jù)隱藏:數(shù)據(jù)成員是私有的,因此其他類無(wú)法訪問(wèn)數(shù)據(jù)成員貌矿。
3.易于測(cè)試:?jiǎn)卧獪y(cè)試對(duì)于封裝類很容易炭菌。

例子:

// A Java class which is a fully encapsulated class.
public   class Car
{
    
     // private variable  
     private  String name;
    
     // getter method for name  
     public  String getName()
   {
       return  name;
      
   }
    
     // setter method for name  
     public   void  setName(String name)
   {
       this .name = name  
   }
    
}
 
 
// Java class to test the encapsulated class.  
public class Test
{
     public   static   void  main(String[] args)
   {
      
       // creating instance of the encapsulated class  
       Car car
       = new  Car();
      
       // setting value in the name member  
       car.setName( "Honda" );
      
       // getting value of the name member  
       System.out.println(car.getName());
      
   }
    
}

支柱3:繼承
繼承是一個(gè)類在Java中從另一個(gè)類繼承屬性和方法的過(guò)程。當(dāng)我們有是-a對(duì)象之間的關(guān)系逛漫。Java中的繼承是通過(guò)以下方式實(shí)現(xiàn)的延展關(guān)鍵詞黑低。

現(xiàn)實(shí)生活的例子:
地球和火星繼承了超級(jí)太陽(yáng)系,太陽(yáng)系繼承了銀河系酌毡。因此克握,銀河系是一流的太陽(yáng)系,地球和火星的超級(jí)等級(jí)枷踏。

在提出代碼之前菩暗,讓我們用一個(gè)通用示例來(lái)討論繼承在java應(yīng)用程序中的使用。因此呕寝,考慮一個(gè)擴(kuò)展Exception類的示例勋眯,以創(chuàng)建一個(gè)特定于應(yīng)用程序的異常類,該類包含更多信息下梢,如錯(cuò)誤代碼客蹋。例如,NullPointerException孽江。

Java中有5種不同類型的繼承讶坯,如下所示:

1.單一繼承:類B使用擴(kuò)展關(guān)鍵字繼承B類
2.多級(jí)繼承:C類繼承B類,B類使用EXTEND關(guān)鍵字繼承A類
3.等級(jí)繼承:類B和C使用EXTEND關(guān)鍵字按層次順序繼承A類
4.多重繼承:C類繼承了A和B類岗屏,這里A和B都是超類辆琅,C只是一個(gè)子類。Java不支持多重繼承这刷,但我們可以使用接口實(shí)現(xiàn)婉烟。
5.混合繼承:類D繼承類B,C類繼承A暇屋。這里似袁,類D繼承了兩個(gè)超類,因此Java也不支持混合繼承。

例子:

// super class
class Car {
   // the Car class have one field
   public String wheelStatus;
   public int noOfWheels;
 
   // the Car class has one constructor
   public Car(String wheelStatus, int noOfWheels)
   {
     this .wheelStatus = wheelStatus;
     this .noOfWheels = noOfWheels;
   }
 
   // the Car class has three methods
   public void applyBrake()
   {
     wheelStatus = "Stop" System.out.println(
       "Stop the car using break" );
   }
 
   // toString() method to print info of Car
   public String toString()
   {
     return ( "No of wheels in car " + noOfWheels + "\n"
         + "status of the wheels " + wheelStatus);
   }
}
 
// sub class
class Honda extends Car {
 
   // the Honda subclass adds one more field
   public Boolean alloyWheel;
 
   // the Honda subclass has one constructor
   public Honda(String wheelStatus, int noOfWheels,
          Boolean alloyWheel)
   {
     // invoking super-class(Car) constructor
     super (wheelStatus, noOfWheels);
     alloyWheel = alloyWheel;
   }
 
   // the Honda subclass adds one more method
   public void setAlloyWheel(Boolean alloyWheel)
   {
     alloyWheel = alloyWheel;
   }
 
   // overriding toString() method of Car to print more
   // info
   @Override public String toString()
   {
     return ( super .toString() + "\nCar alloy wheel "
         + alloyWheel);
   }
}
 
// driver class
public class Main {
   public static void main(String args[])
   {
 
     Honda honda = new Honda( 3 , 100 , 25 );
     System.out.println(honda.toString());
   }
}

支柱4:java的多態(tài)性

多態(tài)是以多種方式執(zhí)行許多事情的能力昙衅⊙锼“多態(tài)”一詞來(lái)自兩個(gè)不同的希臘語(yǔ)單詞--多態(tài)和變形《妫“Poly”的意思是很多著瓶,“變形”的意思是形式。所以多態(tài)意味著很多形式啼县。在繼承的情況下也可以存在多態(tài)性材原。根據(jù)實(shí)際實(shí)現(xiàn),這些函數(shù)的行為不同季眷。

現(xiàn)實(shí)生活的例子:
送貨人將物品交付給用戶华糖。如果是郵遞員,他會(huì)送信的瘟裸。如果是送餐的男孩,他會(huì)把食物交給用戶诵竭。像這樣话告,多態(tài)性為傳遞函數(shù)實(shí)現(xiàn)了不同的方式。

有兩種類型的多態(tài)性卵慰,如下所示:

1.靜態(tài)或編譯時(shí)多態(tài)性
2.動(dòng)態(tài)或運(yùn)行時(shí)多態(tài)性
靜態(tài)或編譯時(shí)多態(tài)性當(dāng)編譯器能夠確定實(shí)際函數(shù)時(shí)沙郭,它被稱為編譯時(shí)多態(tài)編譯時(shí)多態(tài)可以通過(guò)方法超載在爪哇。當(dāng)類中的不同函數(shù)具有相同的名稱但有不同的簽名時(shí)裳朋,就稱為方法重載病线。方法簽名包含名稱和方法參數(shù)。因此鲤嫡,重載方法有不同的參數(shù)送挑。參數(shù)在數(shù)字或參數(shù)類型上可能有所不同。

例1:靜態(tài)多態(tài)性

public class Car{
   
   public void speed() {
   }
   
   public void speed(String accelerator) {
   }
   
   public int speed(String accelerator, int speedUp) {
     return carSpeed;
   }
}

當(dāng)編譯器無(wú)法確定它是超類方法還是子類方法時(shí)暖眼,就會(huì)發(fā)生動(dòng)態(tài)或運(yùn)行時(shí)多態(tài)性惕耕。運(yùn)行時(shí)間多態(tài)運(yùn)行時(shí)多態(tài)是通過(guò)方法覆蓋。當(dāng)超類方法在子類中被重寫時(shí)诫肠,它被稱為方法重寫司澎。

例2:動(dòng)態(tài)多態(tài)性

import java.util.Random;
 
class DeliveryBoy {
 
   public void deliver() {
     System.out.println( "Delivering Item" );
   }
 
   public static void main(String[] args) {
     DeliveryBoy deliveryBoy = getDeliveryBoy();
     deliveryBoy.deliver();
   }
 
   private static DeliveryBoy getDeliveryBoy() {
     Random random = new Random();
     int number = random.nextInt( 5 );
     return number % 2 == 0 ? new Postman() : new FoodDeliveryBoy();
   }
}
 
class Postman extends DeliveryBoy {
   @Override
   public void deliver() {
     System.out.println( "Delivering Letters" );
   }
}
 
class FoodDeliveryBoy extends DeliveryBoy {
   @Override
   public void deliver() {
     System.out.println( "Delivering Food" );
   }
}

輸出量

Delivering Letters
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市栋豫,隨后出現(xiàn)的幾起案子挤安,更是在濱河造成了極大的恐慌,老刑警劉巖丧鸯,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛤铜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)昂羡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門絮记,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人虐先,你說(shuō)我怎么就攤上這事怨愤。” “怎么了蛹批?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵撰洗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我腐芍,道長(zhǎng)差导,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任猪勇,我火速辦了婚禮设褐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泣刹。我一直安慰自己助析,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布椅您。 她就那樣靜靜地躺著外冀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掀泳。 梳的紋絲不亂的頭發(fā)上雪隧,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音员舵,去河邊找鬼脑沿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛固灵,可吹牛的內(nèi)容都是我干的捅伤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼巫玻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丛忆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起仍秤,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熄诡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诗力,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凰浮,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡我抠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袜茧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菜拓。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖笛厦,靈堂內(nèi)的尸體忽然破棺而出纳鼎,到底是詐尸還是另有隱情,我是刑警寧澤裳凸,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布贱鄙,位于F島的核電站,受9級(jí)特大地震影響姨谷,放射性物質(zhì)發(fā)生泄漏逗宁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一梦湘、第九天 我趴在偏房一處隱蔽的房頂上張望瞎颗。 院中可真熱鬧,春花似錦捌议、人聲如沸言缤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至轿曙,卻和暖如春弄捕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背导帝。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工守谓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人您单。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓斋荞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親虐秦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子平酿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容