1. 程式人生 > >我的JAVA筆記005----JAVA面向物件(上)

我的JAVA筆記005----JAVA面向物件(上)

我的JAVA筆記

----------------------------------第一章JAVA面向物件(上)
----------------------------------2019.1.14

1.面對物件概念

1.1面向物件和麵向過程

  • 面向過程:基於步驟的解決方法。
    優點:效能比面向物件高,因為類呼叫時需要例項化,開銷比較大,比較消耗資源(微控制器、嵌入式開發一般採用面向過程,效能比較重要)
    缺點:不易維護,複用,擴充套件

  • 面向物件:分解成不同的物件,建立物件以描述行為。一組物件互相配合通過溝通完成特定的功能。
    優點:易維護,複用,擴充套件
    缺點:效能較面向過程低

1.2面向物件的相關概念

  • 型別(類),指一個名詞概念,比如:客人,菜品
  • 引用(變數),指引用具體概念例項的代詞,比如某人,某道菜
  • 物件(東西),指的是具體概念的個體例項,比如一盤大盤雞
  • 行為,方法
  • 多型,行為或引用在具體情形下發生變化
  • 封裝
  • 繼承

2.面向物件的主要特徵

(1)封裝(將一個類的成員變數私有化。)
目標:實現軟體部件的“高內聚,低耦合”
(2)繼承(Java的繼承是單繼承,每個子類最多隻有一個直接父類。)
目標:提高軟體的可重用性和可擴充套件性
(3)多型(多型是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定。)

  • Java 引用變數有兩個型別:一個是編譯時的型別,一個是執行時的型別,編譯時的型別由宣告該變數時使用的型別決定,執行時的型別由實際賦給該變數的物件決定。
  • 如果編譯時型別和執行時的型別不一致,這就有可能出現所謂的多型。兩個相同型別的引用變數,由於它們實際引用的物件的型別不同,當它們呼叫同名方式時,可能呈現出多種行為特徵,這就是多型。

目標:增強軟體的靈活性和擴充套件性

(4)抽象

3.類和物件

  • 一個類裡可以包含三種最常見的成員:構造器、屬性、方法。
  • new關鍵字:通過關鍵字new 加上對應的構造器,建立物件。
  • static關鍵字:”靜態”。所有有static 修飾的叫類屬性,類方法,類成員。(可以直接通過類名呼叫該屬性和方法,非static就需要通過該類的例項物件呼叫)
  • this 關鍵字:總是指向呼叫該方法的物件。(this區域性變數)
    注意:this不能出現在static修飾的方法中
  • 物件的預設值:null

4.Java變數(區域性變數、例項變數、靜態變數)

  • 成員變數指的是在類範圍裡定義的變數。

  • 區域性變數指的是在一個方法內定義的變數。區域性變數可分為三種:形參、方法區域性變數、程式碼塊區域性變數。

  • 根據有無static 修飾可分為例項變數和靜態變數。
    (1) 例項變數屬於某個物件的屬性,必須建立了例項物件,其中的例項變數才會被分配空間,才能使用這個例項變數。
    (2)靜態變數屬於類,(類變數),只要程式載入了類的位元組碼,靜態變數就會被分配空間,就可以直接通過類名呼叫了。
    (3)例項物件取決於類的例項,每建立一個例項,jvm為例項變數分配一塊記憶體,位於堆區(heap)中,生命週期取決於例項的生命週期。
    (4)類的靜態變數在記憶體中只有一個,Java虛擬機器為靜態變數分配記憶體,靜態變數位於方法區,被類的所有例項共享,生命週期取決於類的生命週期。

5.訪問控制權限

  • private 私有的。在同一個類裡能被訪問
  • default 預設的。本包訪問許可權
  • protected 受保護的。子類中也能訪問
  • public 公共的。在任何地方都可以訪問

6.物件

6.1建立物件

  • 構造器的作用:用來描述物件的建立過程。
  • Java中的構造器:
    (1)Java類一定有構造器(預設)
    (2)使用關鍵字new時,jvm呼叫構造方法建立物件
    (3)無宣告時,javac提供一個無參預設構造器,如果有宣告,javac便不再提供
    (4)可過載,多個引數不同的構造器,為了實現構造方法的重用

6.2物件例項化過程

step1:在建立類之前,檢查類是否載入(將硬碟上的.class檔案載入到記憶體中),如果沒有就載入這個類,在載入這個類之前要載入所有父類。
Java執行時載入的策略:懶惰式載入(按需載入),如果第一次用到就載入,只加載一次。通過CLASSPATH指定的路徑尋找.class檔案,載入以後是一個物件,型別是Class。
step2:在記憶體堆中分配物件空間,遞迴分配所有父類和子類屬性空間。
屬性預設自動初始化,自動初始化為“0”值。
step3:進行屬性的賦值。
step4:遞迴呼叫父類構造器。(預設無參)
step5:呼叫本類構造器。

6.3Java記憶體管理與分配

(1)棧stack:LIFO(後進先出)
(2)堆heap:隨機分配

6.4物件方法

6.4.1方法簽名

(1)方法簽名=方法名+引數型別列表
注意:方法簽名不包括返回型別和訪問修飾符
(2)Java中不能存在相同方法簽名的方法

6.4.2方法引數

(1)Java方法引數的傳遞:值傳遞,變數值的複製。
(2)基本型別就是值的複製
(3)引用型別是引用值(地址)的複製

6.4.3過載和重寫

編譯時多型:過載(overload)
執行時多型:重寫(override)

  • 過載:方法名相同,方法引數列表不同
    (1)不能通過訪問許可權、返回型別、丟擲的異常進行過載
    jvm無法判斷到底呼叫哪一個
    (2)異常型別和數目不造成影響
    (3)jvm對方法引數實行自動向上轉型,當有多個滿足方法引數列表時,jvm以“就近原則”呼叫

  • 重寫:子類重寫父類中的方法,方法簽名一致
    (1)不能重寫父類private方法
    子類無法訪問父類的private方法,無法重寫該方法。若方法簽名、返回值相同,只是子類定義了一個新方法。
    (2)丟擲的異常必須與被重寫的方法所丟擲的異常一致或是其子類。