【從基礎學 Java】對象

在 Java 裏,咱們能夠說,一切皆對象。咱們生活在一個被對象環繞的世界:咱們的狗、桌子、自行車。Java 裏,對象有兩大特性:狀態(state)和行爲(behavior)。其中,狀態是對象屬性的描述(如:一隻貓有眼睛、耳朵、尾巴等);行爲是對對象能力的歸納(如:貓會叫、吃飯、抓老鼠)。同時,對象是基於的。也就是說:類是對象的模板。java

Java 中的對象是對面向對象編程(OOP)很好的詮釋,使用對象,可使:編程

  • 程序模塊化
  • 隱藏細節
  • 代碼複用
  • 組件可拔插

在這篇博文裏,我會把這些概念拓展講開:模塊化

上面已經說過,類是對象的模板,或者說,類是對象的圖紙(blueprint)。咱們會在類裏定義一個和現實世界對應的對象的狀態和行爲。this

在設計一個類時,有以下幾點供咱們參考:設計

  • 保證數據的私有
  • 必定要對數據進行初始化
  • 不要在類裏使用過多的基本數據類型
  • 不用對全部的字段進行 setter 和 getter
  • 將職能進行劃分

封裝

對於一個 Java 類,一般提供:日誌

  • 私有的字段
  • 公共的訪問

同時,咱們要注意:不用把一個引用型的值放在 getter 裏。例如,咱們有一個 Person 類,以下定義:code

class Person{
    private Date birth;
    public void setBirth(Date birth){
        this.birth = birth;
    }
    public Date getBirth(){
        return this.birth;
    }
}

假如咱們用下面的代碼:對象

Person perseon = new Person();
// 省略經過 setter 給 pesron 的 birth 屬性賦值
Date date = person.getBirth();
person.setBirth(new Date());
// date的值已經改變了

方法

對於 Java 而已,方法這一律念旨在說明一個類所具備的行爲,通常是封裝了一系列能夠改變狀態的代碼,如:getName()saySomething(),同時,咱們須要注意:seo

在 Java 中,對對象採用的不是引用傳遞,而是值傳遞。即:
一個方法沒法修改基本數據類型的參數
一個方法能夠改變對象參數的狀態
一個方法不能讓對象參數引用一個新的對象

對於上述的結論,咱們有以下代碼爲證:資源

// 該方法不會交換 p1 和 P2 的引用 
public void swap(Person p1, Person p2){
    Person tmp = new Person();
    tmp = p1;
    p1 = p2;
    p2 = tmp;
}

構造對象

若是咱們想要一個對象, 能夠經過 new 關鍵字構造一個對象,這裏,咱們的 new 會調用類的構造方法(和類同名的無返回值的特殊方法)。

Java 構造對象時,一般遵循如下原則:

  • 首先調用構造代碼塊
  • 使用構造方法,爲實例變量初始化(基本數據類型初始化爲類 0 的默認值,類類型爲 null)
  • 使用 finalize 關鍵字"析構"一個對象(在 gc 以前回收資源)

類的經常使用方法

對於一個 Java 類,咱們但願提供如下一些重要的方法:

equals 方法

咱們通常用 equals() 方法比較兩個對象的引用是否相同。可是,在實際開發過程當中,這種使用對象引用判斷對象相等彷佛沒太大做用,咱們更傾向於帶邏輯的相等。若是兩個對象相等,那麼這種相等應該知足以下特性:

  • 自反性:若是 x 不爲 null,x.equals(x) 爲 true
  • 對稱性:若是 x.equals(y),那麼 y.equals(x)
  • 傳達性:若是 x.equals(y),y.equals(z),那麼 x.equqls(z)
  • 一致性:若是 x,y 沒有改變,那麼 x.equals(y) 一直成立
  • 對於任意非空引用 x,x.equals(null) 應該爲 false

下面是一個比較完備的代碼:

boolean equals(Object obj){
    
    if (this == obj) return true;
    if (obj == null) return false;
    if(this.getClass() != obj.getClass()) return false;
    
    SomeObj so = (SomeObj)obj;
    // 邏輯代碼
}

也可使用 hashCode() 判斷兩個對象是否相等,Object.hash(obj) 能夠幫咱們的忙。

toString 方法

建議每一個類都添加 toStirng() 方法,便於日誌記錄。

相關文章
相關標籤/搜索