Java中的面向?qū)ο缶幊谈拍罴笆纠?/h1>

在本指南中,您將學(xué)習(xí) Java 中的面向?qū)ο缶幊?(OOP) 概念。面向?qū)ο缶幊滔到y(tǒng) (OOP) 是基于“對(duì)象”的編程概念。面向?qū)ο缶幊痰闹饕康氖翘岣叱绦虻目勺x性、靈活性和可維護(hù)性。

面向?qū)ο缶幊虒?shù)據(jù)及其行為結(jié)合在一起,形成一個(gè)稱為對(duì)象的單一實(shí)體。這使得編程更易于理解。我們將詳細(xì)介紹 OOP 的所有特性,如繼承、多態(tài)、抽象、封裝,以確保您在理解 Java 中的 OOP 時(shí)不會(huì)遇到困難。

支持面向?qū)ο缶幊痰牧餍芯幊陶Z(yǔ)言有:Java、C++、Python、C#、Perl、JavaScript、Ruby、Smalltalk 等。

什么是 Java 中的 OOP 概念

OOP 概念包括以下面向?qū)ο缶幊痰母拍睿?/p>

  • 對(duì)象
  • 抽象
  • 封裝
  • 繼承
  • 多態(tài)

1. 對(duì)象

對(duì)象可以表示具有狀態(tài)和行為的實(shí)體。例如:一輛車是一個(gè)對(duì)象,它具有狀態(tài),如顏色、型號(hào)、價(jià)格,和行為,如速度、啟動(dòng)、換擋、停車等。

讓我們來(lái)理解狀態(tài)和行為之間的區(qū)別。對(duì)象的狀態(tài)是一個(gè)數(shù)據(jù)項(xiàng),可以用值來(lái)表示,例如車的價(jià)格、顏色,可以將它們視為編程中的變量。行為類似于類中的方法,它是一組可以共同執(zhí)行任務(wù)的動(dòng)作。例如,換擋是一個(gè)行為,因?yàn)樗婕岸鄠€(gè)子任務(wù),如速度控制、離合器、換擋手柄的移動(dòng)。

讓我們?cè)倏磶讉€(gè)對(duì)象的例子:

狀態(tài)和行為的示例

示例 1: 
類:房屋 
狀態(tài):地址、顏色、面積 
行為:開(kāi)門、關(guān)門

我們來(lái)看一下如何在 Java 程序中編寫這些狀態(tài)和行為。狀態(tài)可以用實(shí)例變量表示,行為可以用類的方法表示。

class House {
    String address;
    String color;
    double area;
    void openDoor() {
        // 編寫代碼
    }
    void closeDoor() {
        // 編寫代碼
    }
}

示例 2: 
類:汽車 
狀態(tài):顏色、品牌、重量、型號(hào) 
行為:剎車、加速、減速、換擋。

注意:正如我們?cè)谏鲜鍪纠兴?jiàn),對(duì)象的狀態(tài)和行為可以通過(guò)類中的變量和方法來(lái)表示。

2. 類

類可以被看作是一個(gè)可以用來(lái)創(chuàng)建多個(gè)對(duì)象的藍(lán)圖。例如,我們有一個(gè)類 Website,它有兩個(gè)數(shù)據(jù)成員。這只是一個(gè)藍(lán)圖,它不代表任何網(wǎng)站,但使用它我們可以創(chuàng)建代表網(wǎng)站的 Website 對(duì)象。在創(chuàng)建對(duì)象時(shí),我們使用構(gòu)造函數(shù)為對(duì)象提供了獨(dú)立的屬性。

public class Website {
    // 字段 (或?qū)嵗兞?
    String webName;
    int webAge;
    // 構(gòu)造函數(shù)
    Website(String name, int age) {
        this.webName = name;
        this.webAge = age;
    }
    public static void main(String args[]) {
        // 創(chuàng)建對(duì)象
        Website obj1 = new Website("beginnersbook", 11);
        Website obj2 = new Website("google", 28);
        // 通過(guò)引用訪問(wèn)對(duì)象數(shù)據(jù)
        System.out.println(obj1.webName + " " + obj1.webAge);
        System.out.println(obj2.webName + " " + obj2.webAge);
    }
}

輸出:

beginnersbook 11
google 28

3. 抽象

抽象是一個(gè)過(guò)程,您只展示“相關(guān)”數(shù)據(jù),并向用戶“隱藏”不必要的對(duì)象細(xì)節(jié)。例如,當(dāng)您登錄到您的銀行賬戶時(shí),您輸入您的用戶 ID 和密碼并點(diǎn)擊登錄按鈕,點(diǎn)擊登錄后會(huì)發(fā)生什么,輸入數(shù)據(jù)如何發(fā)送到服務(wù)器,如何驗(yàn)證,所有這些細(xì)節(jié)都被抽象化了。點(diǎn)擊此處了解更多:Java 中的抽象。

抽象類示例:

// 抽象類
abstract class Animal {
    // 抽象方法
    public abstract void animalSound();
}
public class Dog extends Animal {
    public void animalSound() {
        System.out.println("Woof");
    }
    public static void main(String args[]) {
        Animal obj = new Dog();
        obj.animalSound();
    }
}

輸出:

Woof

4. 封裝

封裝簡(jiǎn)單來(lái)說(shuō)就是將對(duì)象的狀態(tài)(字段)和行為(方法)綁定在一起。如果您正在創(chuàng)建類,那么您就在進(jìn)行封裝。

示例

  1. 將實(shí)例變量設(shè)為私有,以防止外部直接訪問(wèn)這些變量。您只能通過(guò)類的方法設(shè)置和獲取這些變量的值。
  2. 在類中使用 getter 和 setter 方法來(lái)設(shè)置和獲取字段的值。
class EmployeeCount {
    private int numOfEmployees = 0;
    public void setNoOfEmployees(int count) {
        numOfEmployees = count;
    }
    public double getNoOfEmployees() {
        return numOfEmployees;
    }
}
public class EncapsulationExample {
    public static void main(String args[]) {
        EmployeeCount obj = new EmployeeCount();
        obj.setNoOfEmployees(5613);
        System.out.println("No Of Employees: " + (int) obj.getNoOfEmployees());
    }
}

輸出:

No Of Employees: 5613

類 EncapsulationExample 使用了 EmployeeCount 類的對(duì)象,不能直接獲取員工數(shù)量。它必須通過(guò)同一個(gè)類的 setter 和 getter 方法來(lái)設(shè)置和獲取值。

封裝在 Java 編程中有什么好處?

如果您想在某個(gè)時(shí)刻更改 EmployeeCount 類的實(shí)現(xiàn)細(xì)節(jié),您可以自由進(jìn)行更改,而不影響使用它的類。

5. 繼承

一個(gè)類通過(guò)繼承獲取另一個(gè)類的屬性和功能。繼承提供了代碼重用的概念,每個(gè)子類只定義它獨(dú)有的特性,其余特性可以從父類繼承。

繼承是基于現(xiàn)有類定義新類的過(guò)程,通過(guò)擴(kuò)展其公共數(shù)據(jù)成員和方法,繼承允許我們重用代碼,提高 Java 應(yīng)用程序的重用性。

父類稱為基類或超類。擴(kuò)展基類的子類稱為派生類或子類。

注意:繼承的最大優(yōu)勢(shì)是基類中的代碼無(wú)需在子類中重寫?;惖淖兞亢头椒ㄒ部梢栽谧宇愔惺褂?。

Java 中繼承的語(yǔ)法

要繼承一個(gè)類,我們使用 extends 關(guān)鍵字。這里類 A 是子類,類 B 是父類。

class A extends B {
}

一般化與專門化:為了在 OOP 中實(shí)現(xiàn)繼承的概念,首先需要識(shí)別不同類之間的相似性,以提出基類。

識(shí)別不同類之間的相似性稱為一般化。一般化是從兩個(gè)或多個(gè)類中提取共享特性,并將其組合成一個(gè)通用的超類。共享特性可以是屬性或方法。

與一般化相反,專門化指的是從現(xiàn)有類創(chuàng)建新子類。如果某些屬性或方法只適用于類的某些對(duì)象,則可以創(chuàng)建一個(gè)子類。

繼承示例

class Teacher {
    String designation = "Teacher";
    String college = "Beginnersbook";
    void does() {
        System.out.println("Teaching");
    }
}
public class MathTeacher extends Teacher {
    String mainSubject = "Maths";
    public static void main(String args[]) {
        MathTeacher obj = new MathTeacher();
        System.out.println(obj.college);
        System.out.println(obj.designation);
        System.out.println(obj.mainSubject);
        obj.does();
    }
}

輸出:

Beginnersbook
Teacher
Maths
Teaching

6. 多態(tài)

多態(tài)的字面意思是多種形態(tài)。它是指一個(gè)對(duì)象具有多種形態(tài)。例如,當(dāng)父類引用指向子類對(duì)象時(shí),多態(tài)發(fā)生了。

我們來(lái)看一個(gè)多態(tài)的示例:

class Animal {
    public void animalSound() {
        System.out.println("Default Sound");
    }
}
public class Dog extends Animal {
    public void animalSound() {
        System.out.println("Woof");
    }
    public static void main(String args[]) {
        Animal obj = new Dog();
        obj.animalSound();
    }
}

輸出:

Woof

上面的示例說(shuō)明了多態(tài)。盡管 obj 是 Animal 類型,但由于它引用了 Dog 對(duì)象,所以會(huì)調(diào)用 Dog 類的 animalSound 方法。

小結(jié)

Java 中的 OOP 概念(繼承、封裝、多態(tài)、抽象、對(duì)象和類)通過(guò)分離對(duì)象和它們的行為使編程更加結(jié)構(gòu)化和易于管理。通過(guò)本指南,您現(xiàn)在應(yīng)該對(duì) Java 中的 OOP 特性有了深刻的理解。

 

若你想提升Java技能,可關(guān)注我們的Java培訓(xùn)課程。