摘要:我們生活在一個被對象環繞的世界我們的狗桌子自行車。里,對象有兩大特性狀態和行為。其中,狀態是對象屬性的描述如一只貓有眼睛耳朵尾巴等行為是對對象能力的概括如貓會叫吃飯抓老鼠。同時,對象是基于類的。
在 Java 里,我們可以說,一切皆對象。我們生活在一個被對象環繞的世界:我們的狗、桌子、自行車。Java 里,對象有兩大特性:狀態(state)和行為(behavior)。其中,狀態是對象屬性的描述(如:一只貓有眼睛、耳朵、尾巴等);行為是對對象能力的概括(如:貓會叫、吃飯、抓老鼠)。同時,對象是基于類的。也就是說:類是對象的模板。
Java 中的對象是對面向對象編程(OOP)很好的詮釋,使用對象,可以使:
程序模塊化
隱藏細節
代碼復用
組件可拔插
在這篇博文里,我會把這些概念拓展講開:
類上面已經說過,類是對象的模板,或者說,類是對象的圖紙(blueprint)。我們會在類里定義一個和現實世界對應的對象的狀態和行為。
在設計一個類時,有如下幾點供我們參考:
保證數據的私有
一定要對數據進行初始化
不要在類里使用過多的基本數據類型
不用對所有的字段進行 setter 和 getter
將職能進行劃分
封裝對于一個 Java 類,通常提供:
私有的字段
公共的訪問
同時,我們要注意:不用把一個引用型的值放在 getter 里。例如,我們有一個 Person 類,如下定義:
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(),同時,我們需要注意:
在 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() 方法,便于日志記錄。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68884.html
摘要:本人生性愚鈍,在大學期間沒能好好領略等面向對象編程的魅力。現借助一些較為權威的書籍資料,將基礎知識里比較重要的東西整理成文,命名從基礎學。如果博文不慎侵犯了您的著作權,請聯系我。 和很多大學一樣,我的學校也是從 Java 、C++ 入手,教給我們面向對象 (OOP) 的思想。本人生性愚鈍,在大學期間沒能好好領略 Java 等面向對象編程的魅力。現借助一些較為權威的書籍資料,將 Java...
摘要:即接口是用來描述對象具有的某種功能,而不關心具體實現?;蛘哒f,接口好比服務商指定的標準,由代加工工廠遵守來生產。內部類允許在類中定義其它類,這種定義在類中的類叫做嵌套類。局部類是聲明,匿名類是表達式。匿名類當需要聲明字段或其它方法時。 接口 在繼承那篇博文里,我們已經簡單了解了 Java 接口的概念。即:接口是用來描述對象具有的某種「功能」,而不關心具體實現?;蛘哒f,接口好比服務商指定...
摘要:是一種強類型語言,因此,定義了基本數據類型。運算符先從運算符談起?;緮祿惖幕緮祿愋屯渌呒壋绦蛘Z言比較類似。常用類類型除了一些基本數據類型,提供的一些類類型,使用頻率也很高。 Java 是一種強類型語言,因此,Java 定義了基本數據類型。同時, Java 和其它高級計算機語言一樣,有多種運算符,這在我們編程過程中極為有用。 運算符 先從運算符談起。 顧名思義,運算符解決的是...
摘要:你只需要相信一句話鍵盤敲爛,月薪過萬就行了,進入正文,零基礎入門知識點大綱如下其實到目前為止,的崗位需求還是非常多的,還是大多數企業后臺開發的主流編程語言,功能強大,還是很值得學習的。 ...
摘要:泛型方法泛型類中可以定義靜態非靜態的泛型方法。上述泛型類會被替換成下面形式一般使用第一個限定類型替換變為原始類型,沒有限定類型,使用替換。 引言 在面向對象的世界里,我們如果需要一個容器來盛裝對象。舉個例子:一個籃子。我們可以用這個籃子裝蘋果,也可以用這個籃子裝香蕉?;?OOP 的思想,我們不希望為蘋果和香蕉分別創建不同的籃子;同時,我們希望放進籃子里的是蘋果,拿出來的還是蘋果。于是...
閱讀 4016·2021-09-24 10:24
閱讀 1402·2021-09-22 16:01
閱讀 2724·2021-09-06 15:02
閱讀 1022·2019-08-30 13:01
閱讀 1012·2019-08-30 10:52
閱讀 639·2019-08-29 16:36
閱讀 2240·2019-08-29 12:51
閱讀 2340·2019-08-28 18:29