關於面向對象

来源:http://www.cnblogs.com/leecong/archive/2016/07/16/5677388.html
-Advertisement-
Play Games

面向對象 問題 面向對象的好處 學一門技術是否需要趣味性、通俗性的指導 面向對象 什麼是對象 世間任何事物都可以定義為對象。 什麼是類 類就是把對象的公共屬性和方法抽離出來形成集合的抽象,也就是說,類是一種抽象,用來描述對象特征的抽象。 什麼是實例 實例就是對象,就好比我們,就是人這種抽象的一個實例 ...


面向對象

問題

  • 面向對象的好處
  • 學一門技術是否需要趣味性、通俗性的指導

面向對象

什麼是對象

  世間任何事物都可以定義為對象。

什麼是類

  類就是把對象的公共屬性和方法抽離出來形成集合的抽象,也就是說,類是一種抽象,用來描述對象特征的抽象。

什麼是實例

  實例就是對象,就好比我們,就是人這種抽象的一個實例。

什麼是構造方法

  從字面上來看,構造方法是用來構造對象,當對象正在創建時,會通過構造方法對對象進行初始化。
構造方法的特征:

  • 與類同名
  • 無返回值
  • 未定義時,會創建一個預設構造方法

什麼是方法重載

  方法重載就是同一個方法,在使用的時候能夠根據你參數的類型,從而表現出不同的行為

public class person {
    public void eat(){
        System.out.println("沒東西可以給我吃");
    }

    public void eat(Fruit fruit){
        System.out.println("我正在吃水果");
    }

    ...
}

方法重載提供了函數可擴展的能力,使用時僅需:

  • 方法名相同
  • 參數類型或參數個數不同

面向對象三大特性

封裝

優點:

  • 松耦合
  • 隱藏類的內部實現
  • 對外部只暴露必要的介面,避免使用者使用非法的操作來改變類對象的內部結構

  通常,我們在設計一個功能時,總是會把與該功能類似的所有屬性和行為都封裝在一個類中,這樣就可以避免功能內部的行為與別的類產生依賴性,別人使用你的功能時,僅僅需要知道如何調用你的介面來獲取想要的信息,不需要理會內部實現到底是怎麼做。
  對於類的內部,一般開發者只提供必要的介面來訪問它的內部屬性,不會允許你直接操作它的內部,這樣做有利於保證使用者是按照設計者的設計邏輯控制使用,避免因為非法使用而導致錯誤的發生。

繼承

特點:

  • 子類擁有父類非 private 的屬性和方法
  • 子類具有自己的屬性和方法,可以擴展新的行為
  • 子類還可以重寫從父類的行為

優點

  • 實現代碼復用
  • 方便設計嚴密的類登記結構體系(樹狀)

  對象的繼承是一種 'is-a' 的關係,如果兩個對象 A 和 B ,可以描述為 ‘B 是 A’,則表明 B 可以繼承 A。
  繼承關係不能簡單地理解為父親和兒子的關係,繼承關係實際上是一種特殊關係,就好比貓和哺乳動物,貓是哺乳動物的一種特殊抽象,因為它除了具備哺乳動物的特性外,還具備自己獨有的個性;比如它會抓老鼠、抓魚,這些並不是哺乳動物的共同特性。
  當然,在設計類的時候,千萬不要為了繼承而繼承,過多的使用繼承會使得整個類層次結構變得十分複雜,使得類與類之間的耦合性變強,所以在使用繼承的時候千萬要理清對象與對象之間的關係;在沒有必要選擇繼承的情況下推薦使用組裝。
  當然是否要使用繼承,這也得看具體情況,當兩個類擁有 ‘is-a’ 的關係,可以使用繼承;當兩個類擁有 'has-a' 的關係,可以使用組裝。

多態

  多態也叫動態綁定,即是系統在運行時會根據對象的運行時類型,從而表現出不同的行為
特點:

  • 子類以父類的身份出現
  • 子類在工作時以自己的方式去實現
  • 子類以父類的身份出現時,特有的屬性和行為不可以使用

  與動態綁定相對的則是靜態綁定,C語言編程採用的就是靜態綁定。靜態綁定是在 編譯期進行,也就是說,你的程式在編譯的時候,他已經對各個方法的調用的地址已經做了綁定,所以在運行的時候,程式會直接根據你的方法地址去調用具體的方法。
  而向面向對象編程多態採用的則是動態綁定,那麼動態綁定他到底是如何做的呢?程式運行的時候又是如何確定它的運行時類型從而調用對應的方法的呢?
  之後再詳解。

抽象類

特點:

  • 抽象類不能實例化
  • 抽象方法是必須被子類重寫的方法
  • 如果類中包含抽象方法,那個該類必須要被定義為抽象類

      抽象類通常代表一個抽象概念,它提供一個繼承的出發點,當設計一個新的抽象類時,一定是要用來繼承的,所以,在一個以繼承關係形成的等級結構裡面,樹葉節點應當是具體類,而樹枝節點應當是抽象類

介面

特點:

  • 介面不能實例化
  • 欄位預設都是public static final 類型
  • 只能定義抽象方法

介面和抽象類的區別

  對於初學者來說,很多人在學習的時候,肯定都會有這麼一個疑問,介面和抽象類的區別到底是什麼,我們在設計程式的時候,什麼時候應該用抽象類,什麼時候用介面呢?

那麼先來說說這兩者的使用特點的區別:

  • 抽象類可以定義抽象方法,也可以定義基本方法(即自己方法給方法做出實現),而介面只能定義抽象方法
  • 一個類只能繼承一個抽象類,但可實現多個介面
  • 子類可以選擇只實現部分抽象類的成員(這樣子類也是一個抽象類),但必須對介面所有成員進行實現

那麼現在就來說說它們在設計思想上的區別:

  • 類是對對象的抽象;抽象類是對類的抽象;介面是對行為的抽象
  • 如果行為跨越不同類型的對象(例如飛機、鳥,不是同一類對象,但都有飛行這種行為),可考慮使用介面;如果是對於一些相似的對象(例如貓、狗都屬於動物),則考慮抽象出抽象類,讓其繼承
  • 從設計角度講,抽象類是對子類公共部分的抽象,而介面根本不知子類的存在,而是預先定義了一套行為

  也就是說,不論是介面、抽象類、類甚至對象,都是在不同層次、不同角度進行抽象的結果,它們的共性就是抽象。通常抽象類是對目前一類存在共性的子類的一種泛化,通過抽離出子類間的共同屬性和行為,從而進行抽象的一種泛化;而介面則是預先定義了一套有關聯的行為,至於誰會實現這套行為,開發者自行決定,而我要做的只是告訴介面的實現類你擁有哪些行為而已。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Spring IOC 容器支持自動裝配 Bean,所謂自動裝配是指,不需要通過 <property> 或 <constructor-arg> 為 Bean 的屬性註入值的過程。 二、配置: 在 <bean> 的 autowire 屬性里指定自動裝配的模式。預設為 no 。可以通過 <beans> ...
  • Java中ScheduleThreadPoolExecutor主要用於執行延遲任務或者按照一定的頻率執行任務。其中scheduleAtFixedRate函數是按照一定頻率執行任務,scheduleWithFixedDelay可以根據延遲一定時間再執行任務。本文將參考ScheduleThreadPoo ...
  • 首先可以去http://www.oracle.com/technetwork/java/javase/downloads下載jdk安裝包。目前jdk已經更新到了8u91/8u92的版本,不過此處我用的jdk版本仍然是jdk8u51,下麵介紹其安裝步驟與環境變數的配置 雙擊應用程式jdk-8u51-w ...
  • 在最近的一次大數據技術討論會上,有一家公司的技術高管談到松耦合和緊耦合的性能表現的話題。正好Laxcus大數據管理系統的設計,從0.x、1.x到2.x版本,也經歷了從緊耦合到松耦合的發展過程。做為親歷者,對這兩種架構的設計和運行效果,我們有清楚的瞭解和認識。下麵就說一說這件事。寫此博文,也希望給做系... ...
  • ...
  • Reactor 模式簡單實現 在網上有部分文章在描述Netty時,會提到Reactor。這個Reactor到底是什麼呢?為了搞清楚Reactor到底是什麼鬼,我寫了一個簡單的Demo,來幫助大家理解他。 網上是這麼描述Reactor的: The Reactor design pattern hand ...
  • 一、概述 觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新。觀察者模式有時成為發佈/訂閱模式,就是讓多個對象在一個對象的狀態改變時被通知到。 二、解決問題 當一個系統有多個類協同工作,如果在一個類中需要知道另外一個類的實現細節才能讓系統運轉, ...
  • 優秀程式設計的Kiss原則(keep it simple,stupid) 優秀程式設計的Kiss原則(keep it simple,stupid) 良好的編程原則與良好的設計工程原則密切相關。本文總結的這些設計原則,幫助開發者更有效率的編寫代碼,並幫助成為一名優秀的程式員。 1.避免重覆原則(DRY ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...