OOP


面向對象

面向對象的本質就是:以類的方式組織代碼,以對象的組織(封裝)數據

創建與初始化對象

使用new關鍵字創建的時候,除了分配內存空間之外,還會給創建好的對象進行默認的初始化以及對類中構造器的調用

構造器

作用

實例化初始值

//有參構造:一旦定義了有參構造,無參就必須顯示定義

  • 使用new關鍵字,本質是在調用構造器

  • 用來初始化值

//alt+insert 生成構造器 ok:有參 第二個無參

特點

和類名相同

沒有返回值

this.當前對象

屬性

字段Field 成員變量

默認初始化:

數字: 0 0.0

char:u0000

Boolean:false

引用:null

修飾符 屬性類型 屬性名 = 屬性值!

屬性賦值的先后順序:

  • 默認初始化 //只能賦值一次

  • 顯示初始化 //只能賦值一次

  • 構造器中賦值 //只能賦值一次

  • 通過“對象.方法”或:對象。屬性“的方式,賦值 //可以賦值多次

順序:1-2-3-4

 

封裝

get/set

image-20220125204650685

封裝的意義

  1. 提高程序的安全性,保護數據

  2. 隱藏代碼的實現細節

  3. 統一接口

  4. 系統可維護增加了

屬性私有get/set

繼承

extends

子類繼承父類就會擁有父類的全部方法

CTRL + H (找到繼承樹)

Java中類只有單繼承,沒有多繼承

super

調用父類的構造器,必須要在子類構造器的第一行。

注意點

  1. super調用父類的構造方法,必須在構造方法的第一個

  2. super必須只能出現在子類的方法或者構造方法中!

  3. super和this不能同時調用構造方法

對比this

代表的對象不同:

this:本身調用者這個對象

super:代表父類對象的應用

前提

this:沒有繼承也可以使用

super:只能在繼承條件下才可以使用

構造方法

this();調用本類的構造

super();調用父類的構造

image-20220127210940167

一個類有n個構造器,最多有n-1個this。剩的那個是super。也就是說在一個類的構造器中至少有一個super

方法的重寫

重寫都是方法的重寫,和屬性無關//重名屬性保留基類的,重名方法保留子類的

父類引用指向子類

方法分調用只和左邊,定義的數據類型有關。

靜態方法和非靜態方法區別很大。

重寫產生於父類和子類之間,是指子類將父類的方法進行重寫而重載是指同一個類中,可以因不同的參數類型,參數個數等可以寫出多個相同名字的方法。

重寫:需要有繼承關系,子類重寫父類的方法!

  1. 方法名必須相同

  2. 參數列表必須相同

  3. 修飾符:范圍可以擴大但不能縮小: Public》Protected》Default》Private

  4. 拋出的異常:范圍,可以被縮小,但不能擴大

  5. 重寫,子類的方法和父類必要一致;方法體不同!

  6. 子類不能重寫父類中private的方法

為什么需要重寫:

父類的功能,子類不一定需要,或者不一定滿足!

Alt + Insert ; override;

父類被重寫的方法的返回值類型是void,則子類重寫的方法的返回值類型只能是void

父類被重寫的方法的返回值類型是A類型,則子類重寫的方法的返回值類型可以是A類或A 類的子類

父類被重寫的方法的返回值類型是基本數據類型(比如:double,則子類重寫的方法的返回值類型必須是相同的基本數據類型

多態

何為多態性:

對象的多態性:父類的引用指向子類的對象

多態的使用:當調用子父類同名同參數的方法時,實際執行的是子類重寫父類的方法---虛擬方法的調用

:有了對象的多態性以后,我們在編譯期,只能調用父類中聲明的方法,但在運行期,我們實際執行的是子類重寫父類的方法。

編譯看左邊,運行看右邊

多態的使用前提:

  • 類的繼承

  • 方法的重寫

對象的多態性,只適應於方法,不適用於屬性

(類型轉換異常:ClassCastException)

instanceof關鍵字的使用

格式:a instanceof A:判斷對象a是否是類A的實例。如果是,返回ture;如果不是,返回false。

使用情景:為了避免在向下轉型時出現ClassCastException的異常,我們在向下轉型之前,先進行instanceof的判斷,一旦返回true,就進行向下轉型。如果返回false,不進行向下轉型。

如果 a instanceof A返回true,則a instanceof B也返回true。

其中,類B是類A的父類。

===================================================================

若子類重寫了父類方法,就意味着子類里定義的方法徹底覆蓋了父類里的同名方法,系統將不可能把父類里的方法轉移到子類中:編譯看左邊,運行看右邊

對於實例變量和則不存在這樣的現象,即使子類里定義了與父類完全相同的實例變量,這個實例變量依然不可能覆蓋父類中定義的實例變量:編譯運行都看左邊。

equals

== 和equals()的區別:

== :運算符

  1. 可以使用在基本數據類型變量和引用數據類型變量中

  2. 如果比較的是基本數據類型變量:比較兩個變量保存的數據是否相等。(不一定類型要相同)

  3. 如果比較的是引用數據類型變量:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體。

equals()方法的使用:

  1. 是一個方法,而非運算符

  2. 只能適用於引用數據類型

  3. Object類中定義的equals()和==的作用是相同的

  4. 像String、Date、File、包裝類等都重寫了Object類中的equals()方法。重寫以后,比較的不是兩個引用的地址是否相同,而是比較兩個對象的“實體內容”是否相同。

  5. 通常情況下,我們自定義的類如果使用equals()的話,也通常是比較兩個對象的“實體內容”是否相同。那么,我們就需要對Object類中的equals()進行重寫

    重寫規則,比較兩個對象的實體內容是否相同

    toString

    1. 當我們輸出一個對象的引用時,實際上就是調用當前對象的toString()

    2. Object類中toString()的定義:

    public String toString() {
       return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
  6. 像String、Date、File、包裝類等都重寫了Object類中的toString()方法。

使得在調用對象的toString()時,返回“實體內容”信息

  1. 自定義類也可以重寫toString()方法,當調用此方法時,返回對象的“實體內容”

包裝類

包裝類的使用:

  1. Java提供了8種基本數據類型對應的包裝類,使得基本數據類型的變量具有類的特征

  2. 掌握的:基本數據類型、包裝類、String三者之間的相互轉換

基本數據類型、包裝類---》String類型:調用String重載的valueOf(Xxx xxx)

String類型---》基本數據類型、包裝類:調用包裝類的parseXxxx(Strig s)

static

static關鍵字的使用

  1. static:靜態的

  2. static可以用來修飾:屬性、方法、代碼塊、內部類

  3. 使用static修飾屬性:靜態變量

    - 屬性,按照是否使用static修飾,又分為:靜態屬性和非靜態屬性(實例變量)

實例變量:我們創建了類的多個對象,每個對象都獨立的擁有一套類中的非靜態屬性。當修改其中一個對象中的非靜態屬性時,不會導致其他對象中同樣的屬性值的修改。

靜態變量:我們創建了類的多個對象,多個對象共享同一個靜態變量。當通過某一個對象修改靜態變量時,會導致其他的對象調用此靜態變量時,是修改過了的。

  • static修飾屬性的其他說明:

    靜態變量隨着類的加載而加載。可以通過“類.靜態變量”的方式進行調用

    靜態變量的加載要早於對象的創建

    由於類只會加載一次,則靜態變量在內存中也只會存在一份:存在方法區的靜態域中

  • 使用static修飾方法:靜態方法

隨着類的加載而加載,可以通過“類.靜態方法”的方式進行調用

靜態方法中,只能調用靜態的方法或屬性

非靜態方法中,既可以調用非靜態的方法或屬性,也可以調用靜態的方法或屬性

  • static注意點:

在靜態的方法內,不能使用this關鍵字、super關鍵字

  • 開發中,如何確定一個屬性是否要聲明為static

屬性是可以被多個對象所共享的,不會隨着對象的不同而不同的

類中的常量也常常聲明為static

開發中,如何確定一個方法是否要聲明為static

操作靜態屬性的方法,通常設置為static的

工具類中的方法,習慣上聲明為static的

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM