面向?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