面向對象編程(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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...