Java面向对象回顾
Java面向?qū)ο蠡仡?/h1>
文章目錄
- Java面向?qū)ο蠡仡?/li>
- 一、面向?qū)ο?/li>
- 1、什么是對(duì)象
- 現(xiàn)實(shí)生活中的對(duì)象與程序中的對(duì)象
- 2、什么是面向?qū)ο?/li>
- 面向過程
- 面向?qū)ο?/li>
- 3、面向過程與面向?qū)ο蟮谋容^
- 思想方面
- 設(shè)計(jì)方式方面
- 實(shí)現(xiàn)方式方面
- 4、面向過程與面向?qū)ο蟮膬?yōu)缺點(diǎn)
- 面向過程的優(yōu)點(diǎn)
- 面向過程的缺點(diǎn)
- 面向?qū)ο蟮膬?yōu)點(diǎn)
- 面向?qū)ο蟮娜秉c(diǎn)
- 5、面向過程與面向?qū)ο蟮氖褂脠?chǎng)景
- 面向過程的使用場(chǎng)景
- 面向?qū)ο蟮氖褂脠?chǎng)景
- 6、Java 中常用的面向過程的操作
- 7、Java 面向過程與面向?qū)ο缶幊淌纠?/li>
- 面向過程:求兩個(gè)證書的最大公約數(shù)
- 面向?qū)ο?#xff1a;求兩個(gè)證書的最大公約數(shù)
- 二、面向?qū)ο?#xff1a;封裝性
- 1、概述
- 2、Java 封裝性的優(yōu)缺點(diǎn)
- 封裝性的優(yōu)點(diǎn)
- 封裝性的缺點(diǎn)
- 3、Java 封裝性的使用場(chǎng)景
- 4、Java 不適用封裝性的場(chǎng)景
- 5、Java 中封裝性的最佳實(shí)踐是什么
- 三、面向?qū)ο?#xff1a;繼承性
- 1、概述
- 2、Java 繼承性的優(yōu)缺點(diǎn)
- 繼承的優(yōu)點(diǎn)
- 繼承的缺點(diǎn)
- 3、Java 繼承性的適用場(chǎng)景
- 4、Java 繼承性的不適用場(chǎng)景
- 5、學(xué)習(xí) Java 的繼承性應(yīng)注意哪些問題
- 6、Java 中繼承性的最佳實(shí)踐是什么
- 四、面向?qū)ο?#xff1a;多態(tài)性
- 1、概述
- 2、Java 多態(tài)性的優(yōu)缺點(diǎn)
- 多態(tài)性優(yōu)點(diǎn)
- 多態(tài)性缺點(diǎn)
- 3、Java 多態(tài)性的適用場(chǎng)景
- 4、Java 多態(tài)性的不適用場(chǎng)景
- 5、學(xué)習(xí) Java 的多態(tài)性應(yīng)注意哪些問題
- 6、Java 中多態(tài)性的最佳實(shí)踐是什么
一、面向?qū)ο?/h1>
頭腦風(fēng)暴:
1、什么是對(duì)象
現(xiàn)實(shí)生活中的對(duì)象與程序中的對(duì)象
一切皆對(duì)象,現(xiàn)實(shí)生活中:電腦、耳機(jī)、水杯、書等等,相比現(xiàn)實(shí)生活,程序中的對(duì)象是抽象出來的,要么是基于現(xiàn)實(shí)中的對(duì)象抽象出來,只包含了現(xiàn)實(shí)中對(duì)象的部分信息,要么是根本應(yīng)用程序的需要而抽象出來的,如:職工對(duì)象(通常只記錄部分與職工相關(guān)性較高的信息),學(xué)生對(duì)象(通常也只記錄與學(xué)生相關(guān)性較高的信息)。職工和學(xué)生是一個(gè)“角色對(duì)象”,因?yàn)樗麄円部赡芡瑫r(shí)是兒子、女兒、父親、母親、觀眾、演員……,但在特定的場(chǎng)景下僅使用他們對(duì)應(yīng)的屬性信息等。程序中也有現(xiàn)實(shí)中不存在的對(duì)象,比如一個(gè)數(shù)據(jù)庫、一張數(shù)據(jù)表、一個(gè)服務(wù)器的連接,這是根據(jù)應(yīng)用程序的需要抽象得到的,為了完成業(yè)務(wù)需求!
2、什么是面向?qū)ο?/h2>
面向?qū)ο髮?duì)應(yīng)的是面向過程。
面向過程
分析解決某個(gè)問題所需要的步驟,然后根據(jù)步驟一步一步通過代碼實(shí)現(xiàn)。
把大象裝進(jìn)冰箱:
面向過程,就是按照我們分析好的步驟,按照步驟解決問題。
面向?qū)ο?/h3>
把事務(wù)分解成一個(gè)一個(gè)對(duì)象,然后對(duì)象之間分工與合作。
把大象裝進(jìn)冰箱:
面向?qū)ο?#xff0c;是以對(duì)象功能來劃分問題,而不是步驟。
3、面向過程與面向?qū)ο蟮谋容^
一句話:面向過程數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)是分離的,按照順序執(zhí)行函數(shù),完成任務(wù);面向?qū)ο蟮臄?shù)據(jù)和操作數(shù)據(jù)的函數(shù)被封裝在對(duì)象內(nèi)部,是統(tǒng)一的,對(duì)象之間通過消息傳遞進(jìn)行協(xié)作,以完成任務(wù)!
面向過程(Procedural Programming)和面向?qū)ο?#xff08;Object-Oriented Programming)是兩種編程范式,它們有著不同的思想、設(shè)計(jì)方式和實(shí)現(xiàn)方法。
思想方面
面向過程思想將程序看作一系列函數(shù)或過程的集合,這些函數(shù)或過程按照順序執(zhí)行,完成特定的任務(wù)。在面向過程的程序設(shè)計(jì)中,數(shù)據(jù)與行為是分開的,數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)是分離的。
面向?qū)ο笏枷?/strong>則認(rèn)為程序應(yīng)該是由一組相互作用的對(duì)象組成的,每個(gè)對(duì)象都有自己的狀態(tài)和行為。面向?qū)ο笤O(shè)計(jì)中,對(duì)象是程序的基本單位,數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)被封裝在對(duì)象內(nèi)部,數(shù)據(jù)與行為是緊密聯(lián)系的。
設(shè)計(jì)方式方面
在面向過程編程中,問題被分解為若干個(gè)子問題,每個(gè)子問題被設(shè)計(jì)成一個(gè)函數(shù),再將這些函數(shù)組合起來完成整個(gè)任務(wù)。程序的設(shè)計(jì)主要關(guān)注如何處理數(shù)據(jù),而不是如何組織數(shù)據(jù)。
在面向?qū)ο?/strong>編程中,問題被抽象成對(duì)象,每個(gè)對(duì)象有自己的屬性和方法,對(duì)象之間通過消息傳遞相互協(xié)作。程序的設(shè)計(jì)主要關(guān)注如何組織數(shù)據(jù),而不是如何處理數(shù)據(jù)。
實(shí)現(xiàn)方式方面
在面向過程編程中,數(shù)據(jù)和函數(shù)是分離的,數(shù)據(jù)的改變需要通過調(diào)用函數(shù)來實(shí)現(xiàn)。常見的面向過程編程語言包括 C、Fortran、Pascal 等。
在面向?qū)ο?/strong>編程中,數(shù)據(jù)和方法被封裝在對(duì)象內(nèi)部,對(duì)象之間通過消息傳遞來實(shí)現(xiàn)數(shù)據(jù)的操作。常見的面向?qū)ο缶幊陶Z言包括 Java、Python、C++、C# 等。
總的來說,面向過程與面向?qū)ο蟾饔袃?yōu)缺點(diǎn),在具體應(yīng)用中需要根據(jù)問題的特點(diǎn)和實(shí)際情況選擇合適的編程范式。
4、面向過程與面向?qū)ο蟮膬?yōu)缺點(diǎn)
面向過程的優(yōu)點(diǎn)
簡(jiǎn)單明了:面向過程的編程思想相對(duì)簡(jiǎn)單,易于理解和實(shí)現(xiàn)。
我覺得面向過程符合人的常規(guī)思想邏輯,我們?yōu)榱诉_(dá)成目標(biāo)做事情也是按步驟進(jìn)行!
效率高:面向過程的編程方式更加接近底層實(shí)現(xiàn),執(zhí)行效率高。
易于維護(hù):面向過程的程序結(jié)構(gòu)清晰,每個(gè)函數(shù)完成一個(gè)特定的任務(wù),容易進(jìn)行維護(hù)。
面向過程的缺點(diǎn)
面向?qū)ο蟮膬?yōu)點(diǎn)
面向?qū)ο蟮娜秉c(diǎn)
技術(shù)門檻高:面向?qū)ο缶幊?strong>思想較為復(fù)雜,需要掌握面向?qū)ο蟮南嚓P(guān)概念和技術(shù)。
執(zhí)行效率較低:面向?qū)ο蟮某绦驅(qū)崿F(xiàn)需要更多的內(nèi)存空間和處理時(shí)間,執(zhí)行效率相對(duì)較低。
我覺得對(duì)象里面不是所有的屬性和方法都會(huì)用到,每次使用要加載整個(gè)對(duì)象,那么就浪費(fèi)了資源、降低了效率!
設(shè)計(jì)復(fù)雜度高:面向?qū)ο缶幊绦枰O(shè)計(jì)對(duì)象的屬性和方法,設(shè)計(jì)復(fù)雜度較高,需要花費(fèi)更多的時(shí)間和精力。
主要關(guān)注如何組織數(shù)據(jù),數(shù)據(jù)組織的合理性需要站在長(zhǎng)遠(yuǎn)、全局的角度考慮。
5、面向過程與面向?qū)ο蟮氖褂脠?chǎng)景
面向過程的使用場(chǎng)景
面向?qū)ο蟮氖褂脠?chǎng)景
6、Java 中常用的面向過程的操作
7、Java 面向過程與面向?qū)ο缶幊淌纠?/h2>
面向過程:求兩個(gè)證書的最大公約數(shù)
在這個(gè)例子中,主程序使用了 Scanner 類獲取用戶輸入的兩個(gè)整數(shù),然后調(diào)用 findGcd 函數(shù)計(jì)算它們的最大公約數(shù)。findGcd 函數(shù)使用了 for 循環(huán)和 if 語句來計(jì)算最大公約數(shù)。整個(gè)程序使用了面向過程的編程方式,將任務(wù)分解為一系列的函數(shù),每個(gè)函數(shù)負(fù)責(zé)完成特定的功能。函數(shù)之間通過參數(shù)和返回值進(jìn)行數(shù)據(jù)傳遞和處理。
import java.util.Scanner;public class GcdCalculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("請(qǐng)輸入第一個(gè)數(shù):");int num1 = scanner.nextInt();System.out.print("請(qǐng)輸入第二個(gè)數(shù):");int num2 = scanner.nextInt();int gcd = findGcd(num1, num2);System.out.println("最大公約數(shù)是:" + gcd);}public static int findGcd(int num1, int num2) {int smaller = num1 < num2 ? num1 : num2;int gcd = 1;for (int i = 1; i <= smaller; i++) {if (num1 % i == 0 && num2 % i == 0) {gcd = i;}}return gcd;}}面向?qū)ο?#xff1a;求兩個(gè)證書的最大公約數(shù)
在這個(gè)例子中,我們將計(jì)算最大公約數(shù)的函數(shù)findGcd放到了 GcdCalculator 類中,并且在主程序中使用了這個(gè)類來創(chuàng)建對(duì)象。這個(gè)程序使用了面向?qū)ο蟮木幊谭绞?#xff0c;將數(shù)據(jù)和操作封裝在一個(gè)類中,使用對(duì)象來調(diào)用方法,實(shí)現(xiàn)了更加直觀和靈活的編程方式。這樣,當(dāng)我們需要計(jì)算多組數(shù)據(jù)的最大公約數(shù)時(shí),只需要?jiǎng)?chuàng)建多個(gè) GcdCalculator 對(duì)象,調(diào)用它們的 findGcd 方法即可。
import java.util.Scanner;public class GcdCalculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("請(qǐng)輸入第一個(gè)數(shù):");int num1 = scanner.nextInt();System.out.print("請(qǐng)輸入第二個(gè)數(shù):");int num2 = scanner.nextInt();GcdCalculator calculator = new GcdCalculator();int gcd = calculator.findGcd(num1, num2);System.out.println("最大公約數(shù)是:" + gcd);}public int findGcd(int num1, int num2) {int smaller = num1 < num2 ? num1 : num2;int gcd = 1;for (int i = 1; i <= smaller; i++) {if (num1 % i == 0 && num2 % i == 0) {gcd = i;}}return gcd;}}二、面向?qū)ο?#xff1a;封裝性
頭腦風(fēng)暴:
1、概述
隱藏具體實(shí)現(xiàn) + 訪問控制,提高安全性
面向?qū)ο蟮姆庋b性指的是將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一個(gè)類中,通過類的接口來訪問和操作數(shù)據(jù),同時(shí)將數(shù)據(jù)的實(shí)現(xiàn)細(xì)節(jié)隱藏在類的內(nèi)部,不暴露給外部。
封裝性是面向?qū)ο缶幊讨凶罨尽⒆钪匾母拍钪弧K梢杂行У?strong>保護(hù)對(duì)象的數(shù)據(jù),防止外部的直接訪問和修改,從而保證了數(shù)據(jù)的安全性和完整性。同時(shí),封裝性還可以隱藏對(duì)象的實(shí)現(xiàn)細(xì)節(jié),使得對(duì)象的使用者不必關(guān)心對(duì)象的內(nèi)部實(shí)現(xiàn),只需要關(guān)心對(duì)象提供的接口即可。
在 Java 中,封裝性通常通過訪問修飾符(public、protected、private)來實(shí)現(xiàn)。將數(shù)據(jù)成員設(shè)置為私有的(private),并提供公有的(public)getter 和 setter 方法,這樣就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問控制和保護(hù),同時(shí)也可以方便地對(duì)數(shù)據(jù)進(jìn)行操作和修改。這樣就實(shí)現(xiàn)了類的封裝性,同時(shí)也提高了代碼的可維護(hù)性和可重用性。
2、Java 封裝性的優(yōu)缺點(diǎn)
封裝性的優(yōu)點(diǎn)
封裝性的缺點(diǎn)
3、Java 封裝性的使用場(chǎng)景
4、Java 不適用封裝性的場(chǎng)景
5、Java 中封裝性的最佳實(shí)踐是什么
三、面向?qū)ο?#xff1a;繼承性
頭腦風(fēng)暴:
1、概述
代碼復(fù)用:繼承其他類的屬性和方法,增強(qiáng)代碼復(fù)用!
Java 面向?qū)ο缶幊讨械睦^承性是指,一個(gè)類可以從已有的類中繼承屬性和方法,從而可以擴(kuò)展已有的類,減少重復(fù)代碼,提高代碼的復(fù)用性和可維護(hù)性。
在 Java 中,一個(gè)類可以通過 extends 關(guān)鍵字繼承另一個(gè)類的屬性和方法。被繼承的類稱為父類或超類,繼承它的類稱為子類或派生類。子類可以訪問父類中的非私有成員(即public、protected和默認(rèn)訪問級(jí)別的成員),并且可以擴(kuò)展父類中的屬性和方法,也可以重寫父類中的方法。
在繼承中,子類繼承了父類的屬性和方法,可以使用父類的實(shí)例變量和方法,從而減少代碼的冗余。另外,繼承還可以實(shí)現(xiàn)代碼的重用和擴(kuò)展,即子類可以擴(kuò)展父類的屬性和方法,并添加新的屬性和方法。
2、Java 繼承性的優(yōu)缺點(diǎn)
繼承的優(yōu)點(diǎn)
繼承的缺點(diǎn)
3、Java 繼承性的適用場(chǎng)景
4、Java 繼承性的不適用場(chǎng)景
5、學(xué)習(xí) Java 的繼承性應(yīng)注意哪些問題
6、Java 中繼承性的最佳實(shí)踐是什么
使用繼承時(shí),需要明確父類和子類之間的關(guān)系,確保繼承關(guān)系的正確性和可讀性。
父類應(yīng)該是穩(wěn)定、可靠的基類,子類應(yīng)該是特定的派生類。因此,在定義父類時(shí),需要遵循單一職責(zé)原則,盡量保持類的簡(jiǎn)潔和高內(nèi)聚性。
在使用繼承時(shí),需要考慮代碼的可維護(hù)性和可擴(kuò)展性。因此,需要注意繼承層數(shù)的問題,以及如何避免過度使用繼承。
在子類中覆蓋父類的方法時(shí),需要遵循里氏替換原則,確保子類對(duì)象可以替換父類對(duì)象,而不會(huì)影響代碼的正確性。
在使用繼承時(shí),需要注意多態(tài)性的應(yīng)用,即子類對(duì)象可以賦值給父類引用,從而實(shí)現(xiàn)不同的行為。
在定義父類和子類的屬性和方法時(shí),需要考慮訪問修飾符的問題,以便確保代碼的封裝性和安全性。
在 Java 中,父類的屬性和方法一般使用訪問修飾符 protected 或 public 。
四、面向?qū)ο?#xff1a;多態(tài)性
1、概述
Java 中的多態(tài)性指的是同一種類型的對(duì)象,在不同的情況下會(huì)表現(xiàn)出不同的行為。具體來說,多態(tài)性可以分為兩種類型:靜態(tài)多態(tài)性和動(dòng)態(tài)多態(tài)性。
靜態(tài)多態(tài)性是指在編譯期確定調(diào)用哪個(gè)方法,例如方法重載(overloading),即一個(gè)類中定義了多個(gè)方法,它們具有相同的名稱,但是參數(shù)列表不同。在調(diào)用這些方法時(shí),編譯器會(huì)根據(jù)參數(shù)列表的不同選擇相應(yīng)的方法。
動(dòng)態(tài)多態(tài)性是指在運(yùn)行期根據(jù)實(shí)際情況選擇調(diào)用哪個(gè)方法,例如方法重寫(overriding),即子類重寫了父類的某個(gè)方法。在調(diào)用這個(gè)方法時(shí),編譯器無法確定具體調(diào)用哪個(gè)方法,需要在運(yùn)行期根據(jù)對(duì)象的實(shí)際類型來決定。
多態(tài)性可以讓程序更加靈活,可以通過繼承和接口實(shí)現(xiàn),使代碼更加模塊化和可擴(kuò)展。
2、Java 多態(tài)性的優(yōu)缺點(diǎn)
多態(tài)性優(yōu)點(diǎn)
多態(tài)性缺點(diǎn)
3、Java 多態(tài)性的適用場(chǎng)景
4、Java 多態(tài)性的不適用場(chǎng)景
5、學(xué)習(xí) Java 的多態(tài)性應(yīng)注意哪些問題
熟悉繼承和多態(tài)的概念:多態(tài)性是基于繼承實(shí)現(xiàn)的,因此必須先掌握繼承的概念和使用方法。
熟悉抽象類和接口:在實(shí)現(xiàn)多態(tài)性時(shí),抽象類和接口是非常重要的工具。因此,必須熟悉如何定義和使用抽象類和接口。
理解動(dòng)態(tài)綁定的概念:多態(tài)性實(shí)現(xiàn)的關(guān)鍵是動(dòng)態(tài)綁定,即在運(yùn)行時(shí)動(dòng)態(tài)地選擇適當(dāng)?shù)姆椒āR虼?#xff0c;必須理解動(dòng)態(tài)綁定的原理和機(jī)制。
理解重寫方法的概念:在多態(tài)性中,子類可以重寫父類的方法。因此,必須理解如何在子類中重寫方法,以及如何在子類中調(diào)用父類的方法。
熟悉多態(tài)性的應(yīng)用場(chǎng)景:多態(tài)性可以應(yīng)用于很多場(chǎng)景,比如實(shí)現(xiàn)不同類型的數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)多種算法、實(shí)現(xiàn)插件架構(gòu)等。因此,必須熟悉多態(tài)性的應(yīng)用場(chǎng)景,以便在實(shí)際編程中靈活應(yīng)用。
注意多態(tài)性的性能問題:多態(tài)性是基于動(dòng)態(tài)綁定實(shí)現(xiàn)的,因此會(huì)帶來一定的性能開銷。因此,在設(shè)計(jì)和實(shí)現(xiàn)程序時(shí),應(yīng)注意多態(tài)性的性能問題,避免出現(xiàn)性能瓶頸。
動(dòng)態(tài)綁定:Java 中的動(dòng)態(tài)綁定是指在程序運(yùn)行期間根據(jù)對(duì)象的實(shí)際類型進(jìn)行方法調(diào)用的過程。具體來說,Java 中的動(dòng)態(tài)綁定是通過虛擬方法表實(shí)現(xiàn)的,當(dāng)程序執(zhí)行時(shí),虛擬機(jī)會(huì)根據(jù)對(duì)象的實(shí)際類型在虛擬方法表中查找方法,以確定調(diào)用哪個(gè)方法。
Java 中的動(dòng)態(tài)綁定可以實(shí)現(xiàn)多態(tài)性,使得不同類型的對(duì)象可以以同樣的方式進(jìn)行方法調(diào)用,這大大提高了代碼的復(fù)用性和靈活性。同時(shí),動(dòng)態(tài)綁定還可以提高代碼的可維護(hù)性和可擴(kuò)展性,因?yàn)橹恍枰薷姆椒ǖ膶?shí)現(xiàn),而不需要修改調(diào)用該方法的代碼。
需要注意的是,動(dòng)態(tài)綁定只適用于實(shí)例方法,靜態(tài)方法和 final 方法不會(huì)被動(dòng)態(tài)綁定,因?yàn)樗鼈兊恼{(diào)用是在編譯期間就被解析的。此外,動(dòng)態(tài)綁定也會(huì)帶來一些性能損失,因?yàn)槊看握{(diào)用方法時(shí)都需要在虛擬方法表中進(jìn)行查找,而這個(gè)過程是比較耗時(shí)的。
6、Java 中多態(tài)性的最佳實(shí)踐是什么
總結(jié)
以上是生活随笔為你收集整理的Java面向对象回顾的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Neutron - Metering配置
- 下一篇: 明翰Java教学系列之进阶面向对象篇