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)行封裝。
示例
- 將實(shí)例變量設(shè)為私有,以防止外部直接訪問(wèn)這些變量。您只能通過(guò)類的方法設(shè)置和獲取這些變量的值。
- 在類中使用 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)課程。
在本指南中,您將學(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)行封裝。
示例
- 將實(shí)例變量設(shè)為私有,以防止外部直接訪問(wèn)這些變量。您只能通過(guò)類的方法設(shè)置和獲取這些變量的值。
- 在類中使用 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)課程。