類與物件

fushuxuan1發表於2024-11-02

是構造物件的模板或藍圖,相當於一個專案的一個個小模組

封裝

是關於一個物件的一個重要概念,即從形式上來看,他就是將一些資料和行為組合裝在一個包內,並對物件的使用者隱藏了資料的實現方式,物件中的資料稱為例項域,操縱資料的過稱為方法,操縱資料的過程稱為方法,一般情況下,資料對外不開放,做到了資料保護,會用一些操縱資料的方法去操作該物件中的資料

物件

Java語言的特徵之一就是物件導向,即OOP,物件的三個主要特徵:

  • 物件的行為 ---可以對物件施加那些操作,或可以對物件施加哪些方法?
  • 物件的狀態 ---當施加那些方法時,物件如何響應?
  • 物件標識 ---如何辨別具有相同行為與狀態的不同物件??

類之間的關係

  • 依賴
  • 聚合
  • 繼承

依賴:

最明顯、最常見的一種關係。如果一個類需要操作另一個類的物件,我們就說這個類依賴於另一個類

聚合:

包含關係,意味著類A的物件包含類B的物件

繼承:

父子關係,具有遺傳現象,兒子具有父親的所有特徵,並且可以進行變異,也可以擁有自己圖特得到特徵和方法

物件的使用

1 . 構造物件

(1)使用構造器構造方法

 new Date();
 new是建立一個物件時需要使用的操作符,
 呼叫類的構造器,類的構造器都是類名加一個括號即Date(),此使成功構造了一個新物件
複製程式碼

(2)將建立的物件賦予一個Date型變數,以便於之後的多次使用

  Date date = new Date();
  此時可以在任何可以使用該date的地方進行使用其方法
複製程式碼

2 . 指定其初始狀態

可以賦予null表示沒有引用任何物件
複製程式碼

3 . 使用其物件的方法

date.getFullYear();
複製程式碼

類的注意

  1. 一個類只能有一個公共類,但可以有任意多個非公共類

  2. 一般一個檔案只有一個類,並不習慣於將多個類放在同一個檔案中

  3. 例項域(即一個物件的屬性)不推薦使用public進行修飾,應當儘可能使用private修飾,在使用相應的set和get方法進行賦值和取值。

  4. 構造器不能對一個存在的物件使用構造器來重新設定例項域,構造器的使用必須在物件的初始化,即伴隨著new的呼叫

  5. 在一個類中,在所有方法不要命名與例項域同名的變數

    構造器:
    - 構造器與類同名
    - 每個類可以有一個以上的構造器(類似於方法的重寫)
    - 構造器可以有0、1個或多個引數
    - 構造器,沒有返回值(即構造器不帶型別)
    - 構造器總是伴隨著new操作一起使用,已經存在的物件不能呼叫構造器,而達到重置例項域的效果    
    複製程式碼

方法的隱式引數和顯式引數

public void A(String a){
    this.a = a;
}
複製程式碼

該方法具有兩個引數:

  1. 第一個引數是隱式引數,輸出現在方法名前的該類物件(public void MyClass A)
  2. 第二個引數是顯示引數,位於方法名後面的括號內(String a)

封裝性的優點

封裝性是Java的三大特性之一,是指利用抽象資料型別將資料和基於資料的操作繫結在一起,使其構成一個不可分割的獨立實體,資料被儲存在資料型別的內部,儘可能的隱藏其內部的細節,不暴露給外部,對允許外部操作的資料,使用一些方法使外部可以訪問進行操作。使用者只能使用這些包裹著資料的對外開放的方法進行對這個物件的訪問,,使用者只需要知道他需要操作的方法即可(當然他也無從得知其中的細節與資料)

封裝的好處

  1. 良好的封裝性可以減少耦合(被封裝的物件的相互關聯性,使物件和資料之間的互相關聯性降低,從而不會牽一髮而動全身)
  2. 類內部的結構可以自由修改
  3. 可以對成員進行更精確的控制,並保證例項域的健康狀況
  4. 隱藏資訊,使使用者不知道具體細節

許可權的限定

  1. public 可以在該包下的任何位置使用該方法
  2. private 只可以在該類中使用該方法,該類之外無法進行訪問,實現資料的隱藏
  3. protected 受保護的,即對其父母子女以及朋友就是開放的,即public;而對其他的使用者就是不可見的,即private

public private protected的區別

final例項域

被定義為final的例項域,構建物件時必須例項化這樣的例項域,並且在之後的操作中,不能對該例項域進行修改。

定義在類上也是不可變的類,並且若使用該類例項化了一個物件,則該final關鍵字只是表示儲存在變數中的物件引用不會在只是其他類的物件。其實該類還可以更改。

靜態域和靜態方法

1.靜態域

每個類只會有一個靜態域,即定義為static,靜態域只屬於類,不屬於任何一個方法。每一個物件都會對所有的例項域都有一份自己的拷貝

class Employee{
    private static int nextId = 1;
}
複製程式碼

2.靜態常量

靜態常量不需要例項化一個物件,就可以使用一個類中的靜態常量 例:

public class Math{
    public static final double PI = 3.1415926;
}
複製程式碼

使用時,

不需要Math math = new Math();
直接使用Math.PI即可以使用這個靜態常量
複製程式碼

final變數一般不可以修改,但在System中有一個setOut的方法,是一個本地方法,不是一個Java語言實現的方法

3.靜態方法

不能向物件實施操作的方法,即沒有隱式引數(沒有this引數的方法),直接由類呼叫使用如:Math.pow(x,a)

使用條件
  • 一個方法不需要訪問物件狀態,其所需引數是通過顯示引數提供(Math.pow(x,a))
  • 一個方法只需要訪問類的靜態域(Employee.getNextId)

4.工廠方法

類似LocalDate和NumberFormat的類使用靜態工廠方法(factory method)來構造物件 例如:

LocalDate.now;
LocalDate.of;
複製程式碼

方法引數

Java中的呼叫都是按值呼叫,方法得到的引數也都是一個拷貝,且方法不能修改任何傳給他的任意引數變數的內容,只是將一個拷貝了的引數進行了值修改,而本身傳進去的引數並沒有改變。

當然也有例外,倘若傳進去一個陣列,因為陣列在宣告時,是記憶體給他分配了一塊連續的記憶體空間,所以他的修改是直接尋找這塊記憶體地址,進行修改,之後的方法引數使用其都是對其地址的引用,故修改的時候會去尋找那一段記憶體地址,進行修改。故陣列可以被修改!!!

另外,若引數是一個物件,拷貝之後,且該物件是對其例項域的引用,因此其地址拷貝之後仍不會變,故在使用物件的引數使用其修改方法時,其物件內部對例項域的引用使其例項域發生改變。

方法引數的使用情況

  • 一個方法不能修改一個基本資料型別的引數
  • 一個方法可以改變一個物件引數的狀態
  • 一個方法不能讓物件引數引用一個新的物件

物件的構造

過載

當多個方法有相同的名字、不同的引數,便產生了過載。

過載解析: 編譯器再呼叫這些方法時,會根據你的引數型別和引數個數進行匹配,從而選擇到適當的函式進行執行,但若找不到匹配的函式方法,則會產生錯誤。

方法的簽名

簽名包括:

  1. 方法名
  2. 引數型別

注:返回型別不是方法簽名的一部分,故兩個名字相同、引數型別也相同、只有返回型別不同的兩個方法是一種方法。

預設域初始化

構造器中沒有顯式的初始化賦值,那麼就會自動預設被賦值為:數值為0、布林值為false,物件引用為null。 不推薦使用預設的自動初始化,推薦宣告一個例項域的時候可以進行顯式的初始化,提高程式碼的可讀性。

相關文章