在 Java 裏,咱們能夠說,一切皆對象。咱們生活在一個被對象環繞的世界:咱們的狗、桌子、自行車。Java 裏,對象有兩大特性:狀態(state)和行爲(behavior)。其中,狀態是對象屬性的描述(如:一隻貓有眼睛、耳朵、尾巴等);行爲是對對象能力的歸納(如:貓會叫、吃飯、抓老鼠)。同時,對象是基於類的。也就是說:類是對象的模板。java
Java 中的對象是對面向對象編程(OOP)很好的詮釋,使用對象,可使:編程
在這篇博文裏,我會把這些概念拓展講開:模塊化
上面已經說過,類是對象的模板,或者說,類是對象的圖紙(blueprint)。咱們會在類裏定義一個和現實世界對應的對象的狀態和行爲。this
在設計一個類時,有以下幾點供咱們參考:設計
對於一個 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 構造對象時,一般遵循如下原則:
對於一個 Java 類,咱們但願提供如下一些重要的方法:
咱們通常用 equals() 方法比較兩個對象的引用是否相同。可是,在實際開發過程當中,這種使用對象引用判斷對象相等彷佛沒太大做用,咱們更傾向於帶邏輯的相等。若是兩個對象相等,那麼這種相等應該知足以下特性:
下面是一個比較完備的代碼:
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) 能夠幫咱們的忙。
建議每一個類都添加 toStirng() 方法,便於日誌記錄。