面向對象編程(OOP)

来源:https://www.cnblogs.com/WoOD-outPut/archive/2023/01/16/17054581.html
-Advertisement-
Play Games

面向對象編程(OOP) 屬性+方法=類 面向過程 步驟清晰簡單, 第一步做什麼, 第二步做什麼... 適用於處理簡單的問題 面向對象 物以類聚和分類的思想模式 思考解決問題需要做出哪些分類, 然後對這些分類進行單獨思考和研究 最後,將分類下的細節進行了面向過程的研究 面向對象適用於複雜問題, 適合處 ...


面向對象編程(OOP)

屬性+方法=類

面向過程

  • 步驟清晰簡單, 第一步做什麼, 第二步做什麼...
  • 適用於處理簡單的問題

面向對象

  • 物以類聚和分類的思想模式
  • 思考解決問題需要做出哪些分類, 然後對這些分類進行單獨思考和研究
  • 最後,將分類下的細節進行了面向過程的研究
  • 面向對象適用於複雜問題, 適合處理多人協作的問題

區別

  • 面向對象其實就是將一個大問題,將其分類發配,對分類後的問題進行面向過程的處理

  • 如: 建一棟大廈, 需要分類, 建材採購; 外觀設計; 外圍建築; 室內設計...等等模塊, 最後構建成大廈, 而分類的問題就是面向過程的研究

  • 對於複雜事物, 從巨集觀上、從整體上分析, 需要使用面向對象的思路來分析整個大系統(將大廈分類成建材採購; 外觀設計; 外圍建築; 室內設計...) 但是, 具體到微觀操作後, 需要使用面向過程的思想(具體建材採購; 外觀設計; 外圍建築; 室內設計...該如何執行)

  • 面向過程是自己把每個方面步驟都寫一遍。面向對象是把別人寫的步驟作為基礎指令再編寫步驟實現更複雜的功能。

  • 面向對象就是框架, 面向過程就是對象內的具體執行


什麼是面向對象

  • 面向對象編程(Object-Oriented Programming, OOP)

  • 本質: 以類的方式組織代碼, 以對象的組織封裝數據

  • 抽象

  • 三大特性

    • 封裝: 一個存錢罐, 對外留一個小口取錢
    • 繼承: 兒子會繼承父親的所有東西. 兒子有了父親的所有特性和東西
    • 多態: 同樣是學習, 但你我學到的東西都是不同的(同一事物表現出的多種形態)
  • 從認識論角度考慮是先有對象後有類

    • 對象是具體事物; 類是抽象,對對象的抽象: (教師是一個抽象的類; 張老師就是一個具體的對象)
  • 從代碼運行角度考慮是先有類後有對象(類其實用C語言來說類似結構體)

    • 類是對象的模板(人民幣的屬性和模樣就是類, 而對象就是根據類創建一張一張5元,100元等)(人都是有名字,性別,年齡等屬性構成類即模板, 而具體的張三,男,22就是一個類的對象)

方法的回顧

  • 修飾符: public static / public void等(static/void可不寫)
  • 返回類型: 基本數據類型和數組
  • **break和return區別: **
    • **break是跳出switch和結束迴圈; **
    • return是用於方法的結束, 方法內,return語句後都不無效
  • 方法名: 駝峰規則和見名知意
  • 參數列表: (參數類型 參數名); (int a) (int[] x)等
  • 遞歸的return: 每次的return是返回到上次調用的方法的時候

方法的一些原則

  • 遵循一個原則:被static修飾的內容會跟隨類的載入而載入,所以靜態化的內容可以不用實例化就直接調用,同時兩個靜態方法之間也可以互相調用

  • 兩個非靜態可以互相調用是因為它們的類實例化後兩個一起被創建

  • 非靜態方法都是在創建一個對象後產生的,所以它們互相知道存在

  • 實際參數和形式參數的數據類型需要對應


參數的傳遞

  • 值傳遞:複製一份;

  • 引用傳遞:新建一個快捷方式(用的時候是同一個地址)/(本質是值傳遞)

    • 值傳遞:實參和形參在記憶體上是獨立的兩個變數。

    • public class TestNum {
          public static void main(String[] args) {
              int num = 3;
              System.out.println("修改前的num值:"+num);
              changeValue(num);
              System.out.println("修改後的num值:"+num);
          }
      
          private static void changeValue(int num) {
              num = 5;
              System.out.println("形參num值:"+num);
          }
      }
      
      /*
      字元串修改前:zhangsan
      字元串修改後:zhangsan
      */
      

    • 引用傳遞:實參和形參在記憶體上指向的是同一個地址

    • user是對象的引用,為實參,然後創建一個副本temp,把它傳遞給形參user1。但是,他們實際操作的都是堆記憶體中的同一個User對象。因此,對象內容的修改也會體現到實參user上。


類和對象的關係

  • 類是一種抽象的數據類型, 它是對某一類事物的整體描述/定義, 但並不代表某一具體事物

    • 動物、植物、手機、人...
    • Person類、Animal類、Car類等, 這些類都是用於描述/定義某一類具體事物應具有的特點和行為
  • package ObjectDemo;
    
    //學生類
    public class Students {
        //屬性:欄位
        //String name = 小明;
        //可以這麼寫但沒用,學生是一個抽象概念,並不是所有學生叫小明
        
        
        String name;// 未賦值,預設null
        int age;//未賦值,預設0
    
        //方法
        public void study() {
            System.out.println(this.name + "在學習");
            //this代表當前這個類的name
            //this是實例本身,哪個實例調用,this就是哪個實例
        }
    }
    
    

對象

  • 對象是抽象類型的具體實例

    • 張三就是人(類)的一個具體實例; 家裡的旺財就是狗(類)的一個具體實例
    • 能夠體現出特點, 展現出功能是具體的實例, 而不是一個抽象概念
  • 以下代碼就是根據上述類(模塊)的抽象概念, 進行實例化對象

  • package ObjectDemo;
    
    //一個程式應只有一個main方法
    public class Application {
        public static void main(String[] args) {
            // 類是抽象的; 需要實例化
            // 實例化後會返回一個對象; idea的功能,你按住alt+enter就行了
            //stu_1就是對象的變數或者盒子, stu_1就是一個根據Students類的具體實例
    
            //以下代碼產生了兩個個不同對象; 類可以產生很多對象(這些對象都有共同屬性, 如名字,年齡等)
            //根據學生類(模板)創建兩個具體的學生對象
            Students stu_1 = new Students();//實例化變數stu_1(可以理解一個叫stu_1的空殼/地址(指針),但還未對其進行添加屬性,如還沒給stu_1軀體的姓名,年齡等)
            //stu_1對象添加屬性的賦值
            stu_1.name = "WoOD";
            stu_1.age = 18;
            System.out.println(stu_1.name);
            System.out.println(stu_1.age);
            System.out.println("=============================");
            Students xMing = new Students();//實例化變數xMing(可以理解一個叫xMing的空殼/地址(指針),但還未對其進行添加屬性,如還沒給xMing軀體的姓名,年齡等)
            //對象添加屬性的賦值
            xMing.name = "小紅";
            xMing.age = 17;
            System.out.println(xMing.name);
            System.out.println(xMing.age);
    
        }
    }
    

類是對象的抽象概念,對象是類的具體實例

  • 上述代碼的實例化的stu_1和xMing可以理解為就是剛出世的嬰兒, 嬰兒剛出世沒有名字沒有年齡等, 但遇到嬰兒,我們本能都會叫其小寶寶等代號, 而stu_1就是代號(對象)而已
  • 更可以理解為是的抽象概念代號; 類的stu_1其實就是一個對象空殼(未添加屬性值的空殼/地址;), 我們是可以對這個空殼進行增加屬性值
  • 換一種說法, 女盆友這個抽象概念, 當實例化對象時可以是未來女友、現女友、前女友、前前女友等對象(未來女友、現女友、前女友都是new出來的對象變數名,只是沒給""女友們"添加屬性值)(也可以理解寵物類, 貓、狗、熊貓等就是實例化的對象名,但未賦屬性值,就像貓貓的name還沒有叫咪咪)
  • 對象名: 前女友、現女友等, 其實存放地址/指針而已, 就是這些對象名是會指向一個存放實體名字或年齡等屬性(名字或年齡如果我們沒有進行添加就是預設null) (想象成: 一個"女友"類, 根據"女友"類的模板創建了"前女友、現女友等"對象名, 而對象名(地址的變數名)就是存放/指向了name和age等屬性的地址)
    • 當"現女友"的name=沈小婷,age=23, 就是對"現女友"這個對象添加了屬性值(記住預設值是null/0)
    • 當 前女友 的name=白知憲,age=19, 就是對前女友這個對象添加了屬性值(記住預設值是null/0)
    • 當"前前女友"的name=宋河英,age=25, 就是對"前前女友"這個對象添加了屬性值(記住預設值是null/0)
    • "未來女友"這個對象, 由於我還沒有"未來女友", 所以我不知道, 但由於我根據類(模塊)創建了一個叫"未來女友"的對象, 因此當輸出"未來女友"這個對象的屬性name和age都會採用預設值null/0
      • "未來女友"對象的name=李Luda, age=25(最近又被顏值吸引了)

創建與初始化對象

new

  • new創建對象時, 除了分配記憶體空間之外, 還會給創建好的對象進行預設值初始化和類中構造器的調用
  • 類種構造器也稱為構造方法, 是在進行創建對象的時候必須要調用的, 並且構造器有以下特點
    • 必須和類名相同
    • 必須沒有返回類型, 也不能寫void
  • 構造器要掌握哦

構造器

  • 一個類即使啥都沒寫也會生成一個構造器(記住在最右邊Application文件運行一次, 中間的class文件才有;不運行最右邊的文件一次, class文件不會有"無顯"構造器)

image

  • new的本質就是調用構造方法(類似調用方法)

  • 初始化屬性的值

  • 有參構造一旦定義, 上面的無參構造必須寫出來

  • 代碼整合

    package ObjectDemo;
    
    //java文件 ---> class文件
    public class PersonDemo {
        //一個類即使啥都沒寫也會有存在一個構造器
    
        //顯示定義構造器
        String name;//這兩個變數就是類/構造器中會用到的屬性變數
        int age;
    
        public PersonDemo() {//無參構造
            this.name = "WoOD";//當使用構造器時都是有參構造時, 無參構造 內 可以不寫,無參構造的框架還是要寫的
            //當對象調用的是無參構造的話,這個無參構造器會直接對其name屬性值進行WoOD的初始化,不會像之前取null
        }
    
        public PersonDemo(String name) {//有參構造
            //有參構造一旦定義, 上面的無參構造必須寫出來
            //沒有 有參構造, 上面的無參構造可以不寫, 在一開始的class文件中會看到自動添加了預設了Person構造(Java文件沒寫哦)
            //1無參2有參,就會分別調用互不影響
            //就是方法重載
            this.name = name;
        }
    
        public PersonDemo(String name, int age) {
            this.name = name;//name就是形參, 記住是當前對象的name
            this.age = age;
        }
    
        //alt + insert
        //會自動生成構造器(可以選擇生成有參或無參)
        //可以把上面的代碼刪除試試
    }
    
    /*Test
    package ObjectDemo;
    
    //一個程式應只有一個main方法
    public class Application {
        public static void main(String[] args) {
            //下述person_1對象是無參數的,所以會自動跳轉到無參數的Person
            PersonDemo person = new PersonDemo();
            System.out.println(person.name);
    
            //針對PersonDemo文件的有參構造
            //類似於方法重載
            //下述person_1對象是有參數的,所以會自動跳轉到有參數的Person
            PersonDemo person_1 = new PersonDemo("WoOD_1", 22);
            System.out.println(person_1.name + " " + person_1.age);
    
        }
    }
    
     */
    

創建對象的記憶體分析

  • 因為"旺財"是字元串,String預設就是final修飾的,也就是常量。

  • 你聲明的dog對象賦值了Pet的模板,這個模板里有變數比如名字,年齡,所以這個dog也是變數,你得給他賦值,而賦的值存放在堆里,dog就是指向存放值的地方

  • 直接看視頻吧, 真的不難理解, 不要被憨批彈幕的給騙了, 多看兩遍, 我有時候都是重覆左方向鍵一直返回看的(還有視頻中的shout是方法,不是構造器)


小結

image

本文來自博客園,作者:Wo_OD,轉載請註明原文鏈接:https://www.cnblogs.com/WoOD-outPut/p/17054581.html


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

-Advertisement-
Play Games
更多相關文章
  • 前言 眾所周知記憶體緩存(MemoryCache)數據是從記憶體中獲取,性能表現上是最優的,但是記憶體緩存有一個缺點就是不支持分散式,數據在各個部署節點上各存一份,每份緩存的過期時間不一致,會導致幻讀等各種問題,所以我們實現分散式緩存通常會用上Redis 但如果在高併發的情況下讀取Redis的緩存,會進行 ...
  • 一般一個人的成長是分幾個階段的,具體如下: 1)剛開始參與開發階段:這個階段基礎不是很好,一邊學基礎,一邊做開發,剛開始的時候大家都是這樣,如果想快速的跳過這個階段,工具書與筆記(自己做的那種)就是速成方法了。大家一定要多辛苦敲代碼。 2)菜鳥階段:所謂菜鳥就是會做資料庫增刪改查,一般到了這個階段就 ...
  • 痞子衡嵌入式半月刊: 第 70 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 如同 STM32F103C8T6 與 CBT6 有著同樣的128K flash容量一樣, 市面上很多晶元, 同一系列的多個型號其實底下使用的是相同的硬體, 只是通過軟體, 晶元ID, 某些隱藏寄存器(例如AIR32F103)或者物理熔斷對容量進行限制. 讓我們看一看 PY32F002AF15P 這顆... ...
  • 列表中自動播放視頻,常規方案是在每個 xml 中寫入視頻佈局,然後在滑動時獲取當前的下標,播放此下標的視頻 弊端:播放容易出錯,需要精準控制好停止播放操作,並且適配器中容易觸發多次刷新,導致執行多次同樣的操作,不易控制離開停止等操作,增加了佈局的負擔,影響滑動流暢度,無法復用... 使用過的都比較清 ...
  • 按鈕: <el-button id="manyou" @click="Ismovement" type="primary" >漫游模式</el-button> 樣式: /* 逗號表示A,B兩個標簽同時擁有大括弧中的CSS樣式 */ .el-button--primary.is-active, /* ...
  • 事件迴圈機制 同步與非同步 我們先思考兩個問題,如下: 為什麼會存在同步和非同步的概念? 我們的JavaScript是單線程的,也就是我們的工作流水線的只有一條。如果我們的任務全放在流水線上,其中一個任務出現問題就會阻塞後面的任務,導致我們的工作流水線卡住。因此為了更加高效合理利用這條流水線,在Java ...
  • 前言 這篇博文續接的是 UML建模、設計原則、創建型設計模式、行為型設計模式,有興趣的可以看一下 3.3、結構型 這些設計模式關註類和對象的組合。將類和對象組合在一起,從而形成更大的結構 * 3.3.1、proxy 代理模式 定義:為某對象提供一種代理以控制對該對象的訪問。即:客戶端通過代理間接地訪 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...