国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

面向?qū)ο蟪绦蛟O(shè)計

這篇具有很好參考價值的文章主要介紹了面向?qū)ο蟪绦蛟O(shè)計。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

OOP

【面向?qū)ο蟪绦蛟O(shè)計】(OOP)與【面向過程程序設(shè)計】在思維方式上存在著很大的差別?!久嫦蜻^程程序設(shè)計】中,算法是第一位的,數(shù)據(jù)結(jié)構(gòu)是第二位的,這就明確地表述了程序員的工作方式。首先要確定如何操作數(shù)據(jù),然后再決定如何組織數(shù)據(jù),以便于數(shù)據(jù)操作。而【面向?qū)ο蟪绦蛟O(shè)計】卻調(diào)換了這個次序,【面向?qū)ο蟪绦蛟O(shè)計】將數(shù)據(jù)放在第一位,然后再考慮操作數(shù)據(jù)的算法。

對于一些規(guī)模較小的問題,將問題分解為過程的開發(fā)方式比較理想。而面向?qū)ο蟾舆m用于解決規(guī)模較大的問題。

面向?qū)ο蟪绦蛟O(shè)計是一種編程范式或編程風(fēng)格。面向?qū)ο蟮某绦蚴怯深惡蛯ο蠼M成的(以類和對象作為組織代碼的基本單元),并將封裝、抽象、繼承、多態(tài)這四個特性,作為程序設(shè)計和實現(xiàn)的基礎(chǔ)。

面向?qū)ο蟪绦蛟O(shè)計語言是【支持類和對象的語法機(jī)制。并有現(xiàn)成的語法機(jī)制,能方便地實現(xiàn) OOP 的四大特性(封裝、抽象、繼承、多態(tài))】的編程語言。

OOP 的四大特性

對于 OOP 的四大特性,我們需要知道每一個特性的如下知識:

  • xxx 特性的含義
  • 為了實現(xiàn) xxx 特性,需要程序設(shè)計語言提供一定的語法機(jī)制來支持。對于這四大特性,盡管大部分面向?qū)ο蟪绦蛟O(shè)計語言都提供了相應(yīng)的語法機(jī)制來支持,但不同的編程語言實現(xiàn)這四大特性的語法機(jī)制可能會有所不同。
  • xxx 特性存在的意義、好處

封裝

封裝(encapsulation)也被稱為數(shù)據(jù)隱藏、數(shù)據(jù)訪問保護(hù)。從形式上看,封裝就是將數(shù)據(jù)和行為組合在一起中,并對對象的使用者隱藏數(shù)據(jù)的實現(xiàn)方式。

對象中的數(shù)據(jù)被稱為實例域(instance field),操作數(shù)據(jù)的過程被稱為方法(method)。對于每個特定的類實例(對象)都有一組特定的實例域值。這些值的集合就是這個對象的當(dāng)前狀態(tài)(state)。

實現(xiàn)封裝的關(guān)鍵在于絕對不能讓類中的方法直接地訪問其他類的實例域。程序僅通過對象的方法與對象數(shù)據(jù)進(jìn)行交互。封裝給對象賦予了 “黑盒” 特征,這是提高重用性和可靠性的關(guān)鍵。這意味著一個類可以全面地改變存儲數(shù)據(jù)的方式,只要仍舊使用同樣的方法操作數(shù)據(jù),其他對象就不會知道或介意所發(fā)生的變化。


為了實現(xiàn)封裝這個特性,需要程序設(shè)計語言提供一定的語法機(jī)制來支持。這個語法機(jī)制就是訪問權(quán)限控制(訪問修飾符:public、protected、private、default)。

在 Java 中,封裝就意味著所有的實例域都帶有 private 訪問修飾符(私有的實例域),并提供帶有 public 訪問修飾符的域訪問器方法和域更改器方法(公共的操作方法)。

如果實例域帶有 public 訪問修飾符,這就破壞了封裝性。因為 public 實例域允許程序中的任何方法對其進(jìn)行讀取和修改。

如果域訪問器方法、域更改器方法直接返回了一個可變對象的引用,這就破壞了封裝性。在 Employee 類中就違反了這個設(shè)計原則,其中的 getHireDay() 方法返回了一個 Date 類對象。Date 類有一個更改器方法 setTime(),可以使用 setTime() 這個方法設(shè)置毫秒數(shù)。Date 對象是可變的,這一點就破壞了封裝性。對 d 調(diào)用更改器方法就可以自動地改變這個雇員對象的私有狀態(tài)。

如果域訪問器方法、域更改器方法需要返回一個可變對象的引用,應(yīng)該首先對對象進(jìn)行克?。╟lone)。

對象 clone 指的是:存放在另一個位置上的對象副本。

class Employee {
    private Date hireDay;

    public Date getHireDay() {
        return hireDay; // Bad
    }
    // ...
}

Employee harry = . .
Date d = harry.getHireDay();
double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000;
d.setTime(d.getTime() - (long) tenYearsInMilliSeconds);
// let's give Harry ten years of added seniority

// 修改后的代碼
class Employee {
    public Date getHireDay() {
        return (Date) hireDay.clone(); // Ok
    }
    // ...
}

封裝存在的意義、封裝的好處:程序僅通過對象的方法與對象數(shù)據(jù)進(jìn)行交互

  • 保護(hù)對象數(shù)據(jù)不被隨意修改。
  • 可以改變類的內(nèi)部實現(xiàn),除了該類的方法之外,不會影響其他的代碼。
  • 更改器方法可以執(zhí)行錯誤檢查,而直接對實例域進(jìn)行賦值將不會進(jìn)行這些處理。例如,setSalary 方法可以檢查薪水是否小于 0。

抽象

封裝主要講的是如何隱藏數(shù)據(jù)、數(shù)據(jù)訪問保護(hù),而抽象講的是如何隱藏方法的具體實現(xiàn),讓方法的調(diào)用者只需要關(guān)心方法提供了哪些功能,并不需要知道這些功能是如何實現(xiàn)的。


我們可以借助程序設(shè)計語言提供的接口類(比如 Java 中的 interface 關(guān)鍵字語法)或者抽象類(比如 Java 中的 abstract 關(guān)鍵字語法)這兩種語法機(jī)制,來實現(xiàn)抽象這一特性。

實際上,抽象這個特性是非常容易實現(xiàn)的,并不需要非得依靠接口類或者抽象類這些語法機(jī)制來支持。換句話說,并不是說一定要為實現(xiàn)類抽象出接口類,才叫作抽象。即便不編寫接口類,單純的實現(xiàn)類本身就滿足抽象特性。

之所以這么說,那是因為類的方法是通過程序設(shè)計語言中的 “函數(shù)” 這一語法機(jī)制實現(xiàn)的。通過函數(shù)包裹具體的實現(xiàn)邏輯,這本身就是一種抽象。調(diào)用者在調(diào)用函數(shù)的時候,并不需要去研究函數(shù)內(nèi)部的實現(xiàn)邏輯,只需要通過函數(shù)的命名、注釋或者文檔,了解該函數(shù)提供了什么功能,就可以直接調(diào)用了。比如,我們在使用 C 語言的 malloc() 函數(shù)的時候,并不需要了解它的底層代碼是怎么實現(xiàn)的。


抽象存在的意義、抽象的好處:

  • 一方面,抽象提高了代碼的可擴(kuò)展性、可維護(hù)性,修改實現(xiàn)不需要改變定義,減少了代碼的改動范圍;
  • 另一方面,抽象是處理復(fù)雜系統(tǒng)的有效手段,抽象能有效地過濾掉不必要關(guān)注的信息。

繼承

繼承(inheritance)即 “is-a” 關(guān)系,是一種用于表示特殊與一般關(guān)系的。

例如,RushOrder 類由 Order 類繼承而來。在具有特殊性的 RushOrder 類中包含了一些用于優(yōu)先處理的特殊方法,以及一個計算運(yùn)費(fèi)的不同方法;而其他的方法,如添加商品、生成賬單等都是從 Order 類繼承來的。

利用繼承,人們可以基于已存在的類構(gòu)造一個新類。繼承已存在的類就是復(fù)用(繼承)這些類的方法和域。在此基礎(chǔ)上,還可以添加一些新的方法和域,以滿足新的需求。

從繼承關(guān)系上來講,繼承可以分為單繼承和多繼承。有些程序設(shè)計語言只支持單繼承,不支持多重繼承,比如 Java、PHP、C#、Ruby 等,而有些程序設(shè)計語言既支持單繼承,也支持多繼承,比如 C++、Python、Perl 等。

  • 單繼承表示一個子類只能繼承一個父類;
  • 多繼承表示一個子類可以繼承多個父類。

為了實現(xiàn)繼承這個特性,需要程序設(shè)計語言提供一定的語法機(jī)制來支持。比如 Java 使用 extends 關(guān)鍵字來實現(xiàn)繼承,C++ 使用冒號來實現(xiàn)繼承(class B : public A),Python 使用 parentheses() 來實現(xiàn)繼承,Ruby 使用 < 來實現(xiàn)繼承。


繼承存在的意義、繼承的好處:繼承的一個最大好處就是代碼復(fù)用。假如兩個類有一些相同的屬性和方法,我們就可以將這些相同的部分,抽取到基類中,讓兩個子類繼承基類。這樣,兩個子類就可以重用基類中的代碼,避免代碼重復(fù)寫多遍。

不過,代碼復(fù)用這個好處也并不是繼承所獨(dú)有的,我們也可以通過其他的方式來解決代碼復(fù)用的問題,比如利用組合關(guān)系。

過度的使用繼承,繼承的層次過深、過復(fù)雜,就會導(dǎo)致代碼的可讀性、可維護(hù)性變差。

  • 可讀性變差的原因:為了了解一個類的功能,我們不僅需要查看這個類的代碼,還需要按照繼承關(guān)系一層一層地往上查看“父類、父類的父類……”的代碼。
  • 可維護(hù)性變差的原因:子類和父類高度耦合,修改父類的代碼,會直接影響到子類。

多態(tài)

一個對象變量可以指向多種實際類型的現(xiàn)象被稱為多態(tài)(polymorphism)。在運(yùn)行時自動地選擇調(diào)用哪個方法的現(xiàn)象被稱為動態(tài)綁定(dynamic binding)。


為了實現(xiàn)多態(tài)這個特性,需要程序設(shè)計語言提供一定的語法機(jī)制來支持。

  • 第一個語法機(jī)制是:程序設(shè)計語言要支持繼承;
  • 第二個語法機(jī)制是:程序設(shè)計語言要支持父類的對象變量可以引用子類對象;
  • 第三個語法機(jī)制是:程序設(shè)計語言要支持方法的重寫(override)。

在 Java 程序設(shè)計語言中,對象變量是多態(tài)的。一個父類的對象變量既可以引用一個父類的對象,也可以引用一個子類的對象。

一個 Employee 變量既可以引用一個 Employee 類的對象,也可以引用一個 Employee 類的任何一個子類的對象(例如, Manager、Executive、 Secretary 等)。

對于多態(tài)特性的實現(xiàn)方式,除了利用 “繼承加方法重寫” 這種實現(xiàn)方式之外,還有其他兩種比較常見的的實現(xiàn)方式,一種是利用接口類語法,另一種是利用 duck-typing 語法。不過,并不是每種程序設(shè)計語言都支持接口類或者 duck-typing 這兩種語法機(jī)制,比如 C++ 就不支持接口類語法,而 duck-typing 只有一些動態(tài)語言才支持,比如 Python、JavaScript 等。

  • 接口類語法:一個對象變量(接口類)可以指向多種實際類型(實現(xiàn)類)
  • duck-typing 語法:duck-typing 可以這樣表述:“如果看起來像鴨子,叫起來像鴨子,那么它一定是鴨子”。

多態(tài)存在的意義、多態(tài)的好處:

  • 多態(tài)的好處是,我們可以在一個比較穩(wěn)定的、抽象的層面上編程,而不被更加具體的、易變的實現(xiàn)細(xì)節(jié)干擾。
  • 多態(tài)也是很多設(shè)計模式、設(shè)計原則、編程技巧的代碼實現(xiàn)基礎(chǔ),比如策略模式、基于接口而非實現(xiàn)編程、依賴倒置原則、里式替換原則、利用多態(tài)去掉冗長的 if-else 語句等。

參考資料

《Java核心技術(shù)卷一:基礎(chǔ)知識》(第10版)

04 | 理論一:當(dāng)談?wù)撁嫦驅(qū)ο蟮臅r候,我們到底在談?wù)撌裁矗?極客時間 (geekbang.org)

05 | 理論二:封裝、抽象、繼承、多態(tài)分別可以解決哪些編程問題? (geekbang.org)文章來源地址http://www.zghlxwxcb.cn/news/detail-412148.html

到了這里,關(guān)于面向?qū)ο蟪绦蛟O(shè)計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 面向?qū)ο蟪绦蛟O(shè)計第三次bolg

    面向?qū)ο蟪绦蛟O(shè)計第三次bolg

    本次博客針對面向?qū)ο蟪绦蛟O(shè)計的課程所發(fā)的PTA作業(yè)7,8以及期末考試中的面向?qū)ο缶幊填}的分析和總結(jié),重點介紹課程成績統(tǒng)計程序系列題目以及期末考試的編程題。 在這次作業(yè)中7-1、7-2內(nèi)容和考點相同,在此我分析一下7-2Hashmap的排序這個問題。 7-2 容器-HashMap-排序 分?jǐn)?shù)

    2024年02月05日
    瀏覽(25)
  • 2023.5.5 面向?qū)ο蟪绦蛟O(shè)計實驗報告

    實驗項目名稱:模板 1、熟練掌握函數(shù)模板和類模板的定義格式。 2、熟練運(yùn)用函數(shù)模板和類模板解決實際問題。 1、復(fù)數(shù)類Complex有兩個數(shù)據(jù)成員:a和b, 分別代表復(fù)數(shù)的實部和虛部,并有若干構(gòu)造函數(shù)和一個重載-(減號,用于計算兩個復(fù)數(shù)的距離)的成員函數(shù)。 要求設(shè)計一個

    2024年02月02日
    瀏覽(26)
  • 面向?qū)ο蟪绦蛟O(shè)計 之 文件輸入輸出流

    面向?qū)ο蟪绦蛟O(shè)計 之 文件輸入輸出流

    石 家 莊 鐵 道 大 學(xué) 實 驗 報 告 課程名稱 面向?qū)ο蟪绦蛟O(shè)計 班級 ? 姓名 ? 學(xué)號 ? 實驗日期 2023.5.16 評分 100 ? 實驗項目名稱:輸入輸出流 一、實驗?zāi)康?掌握文本文件和二進(jìn)制文件的基本訪問方法; 了解一般I/O流和文件流的關(guān)系;了解文件與文件流的關(guān)系; 了解文件系統(tǒng)

    2024年02月05日
    瀏覽(42)
  • C++面向?qū)ο蟪绦蛟O(shè)計 - 類和對象進(jìn)一步討論

    C++面向?qū)ο蟪绦蛟O(shè)計 - 類和對象進(jìn)一步討論

    ? ? ? ? 在C++中,關(guān)于面向?qū)ο蟪绦蛟O(shè)計已經(jīng)講了很大篇幅,也例舉很多案例,此篇將通過一些習(xí)題來進(jìn)一步了解對象、靜態(tài)成員、指針、引用、友元、類模板等等相關(guān)知識。 ? ? ? ? 示例代碼: ? ? ? ? 如上代碼,運(yùn)行后結(jié)果如下圖: ???????? 現(xiàn)在將上述代碼中,第

    2024年04月16日
    瀏覽(25)
  • .NET 面向?qū)ο蟪绦蛟O(shè)計 —— 學(xué)習(xí)筆記 詳細(xì)版

    .NET 面向?qū)ο蟪绦蛟O(shè)計 —— 學(xué)習(xí)筆記 詳細(xì)版

    ????????開始考慮通過封裝、繼承、多態(tài)把程序的耦合度降低(傳統(tǒng)印刷 術(shù)的問題就在于所有的字都刻在同一版面上造成耦合度太高所制),開始用設(shè)計模式使得程序更加的靈活,容易修改, 并且易于復(fù)用。 ????????大鳥說:“且先不說出題人的意思,單就你現(xiàn)在的

    2024年04月26日
    瀏覽(27)
  • C++面向?qū)ο蟪绦蛟O(shè)計-基礎(chǔ)入門(超詳細(xì))

    C++面向?qū)ο蟪绦蛟O(shè)計-基礎(chǔ)入門(超詳細(xì))

    目錄 一、c++概述 二、初識c++ 1、第一個c++程序 ?2、c++面向?qū)ο蟮娜筇匦裕ㄖ匾?三、作用域運(yùn)算符:: 1、使用namespace創(chuàng)建一個命名空間 2、命名空間只能定義在全局 3、 命名空間嵌套 ?4、隨時將新的成員加入命名空間 5、命名空間中 函數(shù)的聲明和實現(xiàn)分開? ?6、

    2024年02月16日
    瀏覽(21)
  • Java面向?qū)ο蟪绦蛟O(shè)計 - 清覽云題庫

    目錄 清覽題庫1 清覽題庫2 清覽題庫3 清覽題庫4 清覽題庫5 1.?? 給出下列【代碼】注釋標(biāo)注的代碼的輸出結(jié)果。 public class Example { ?? public static void main(String args[]) ?{ ????? System.out.println(\\\"hello\\\"); //【代碼】 ? ??????? ?} } 答案 hello 2.?? 給出下列【代碼】注釋標(biāo)注的代碼

    2024年02月08日
    瀏覽(33)
  • C++面向?qū)ο蟪绦蛟O(shè)計 - 運(yùn)算符重載

    C++面向?qū)ο蟪绦蛟O(shè)計 - 運(yùn)算符重載

    ? ? ? ? 函數(shù)重載就是對一個已有的函數(shù)賦予新的含義,使之實現(xiàn)新的功能。因此一個函數(shù)名就可以用來代表不同功能的函數(shù),也就是一名多用。運(yùn)算符也可以重載,即運(yùn)算符重載(operator overloading)。 ? ? ? ? 運(yùn)算符重載的方法是定義一個重載運(yùn)算符的函數(shù),在需要執(zhí)行被

    2024年04月25日
    瀏覽(20)
  • 【面向?qū)ο蟪绦蛟O(shè)計】賬戶類(Java、JavaFX)

    目錄 版本1: 設(shè)計Account1類,包含: 設(shè)計測試類ATMMachine1: 版本2: 擴(kuò)展Account1類為Account2類: ? 設(shè)計測試類ATMMachine2,其主菜單如下: 版本3: uml啥的找不到了,太久遠(yuǎn)了,有什么不懂得評論或者私聊問我吧。 ■ 一個名為id 的int 類型的私有數(shù)據(jù)域(默認(rèn)值為0),長度為6位

    2024年02月08日
    瀏覽(19)
  • 面向?qū)ο蟪绦蛟O(shè)計——多文檔綜合性試驗

    面向?qū)ο蟪绦蛟O(shè)計——多文檔綜合性試驗

    1)創(chuàng)建一個多文檔應(yīng)用程序MyMdi,可以在這個多文檔中可以輸入文本、顯示靜態(tài)圖、動態(tài)圖以及顯示對話框進(jìn)行操作。 2)第一個視圖類的基類為CEditView(CView的子類),可以錄入字符串。 3)第二個文檔畫出靜態(tài)圖,包括五種以上圖形。 4)在第二個文檔菜單欄“畫圖”中點

    2024年02月09日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包