摘要:我們生活在一個被對象環(huán)繞的世界我們的狗桌子自行車。里,對象有兩大特性狀態(tài)和行為。其中,狀態(tài)是對象屬性的描述如一只貓有眼睛耳朵尾巴等行為是對對象能力的概括如貓會叫吃飯抓老鼠。同時,對象是基于類的。
在 Java 里,我們可以說,一切皆對象。我們生活在一個被對象環(huán)繞的世界:我們的狗、桌子、自行車。Java 里,對象有兩大特性:狀態(tài)(state)和行為(behavior)。其中,狀態(tài)是對象屬性的描述(如:一只貓有眼睛、耳朵、尾巴等);行為是對對象能力的概括(如:貓會叫、吃飯、抓老鼠)。同時,對象是基于類的。也就是說:類是對象的模板。
Java 中的對象是對面向?qū)ο缶幊蹋∣OP)很好的詮釋,使用對象,可以使:
程序模塊化
隱藏細(xì)節(jié)
代碼復(fù)用
組件可拔插
在這篇博文里,我會把這些概念拓展講開:
類上面已經(jīng)說過,類是對象的模板,或者說,類是對象的圖紙(blueprint)。我們會在類里定義一個和現(xiàn)實(shí)世界對應(yīng)的對象的狀態(tài)和行為。
在設(shè)計一個類時,有如下幾點(diǎn)供我們參考:
保證數(shù)據(jù)的私有
一定要對數(shù)據(jù)進(jìn)行初始化
不要在類里使用過多的基本數(shù)據(jù)類型
不用對所有的字段進(jìn)行 setter 和 getter
將職能進(jìn)行劃分
封裝對于一個 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的值已經(jīng)改變了方法
對于 Java 而已,方法這一概念旨在說明一個類所具有的行為,一般是封裝了一系列可以改變狀態(tài)的代碼,如:getName()、saySomething(),同時,我們需要注意:
在 Java 中,對對象采用的不是引用傳遞,而是值傳遞。即:
一個方法無法修改基本數(shù)據(jù)類型的參數(shù)
一個方法可以改變對象參數(shù)的狀態(tài)
一個方法不能讓對象參數(shù)引用一個新的對象
對于上述的結(jié)論,我們有如下代碼為證:
// 該方法不會交換 p1 和 P2 的引用 public void swap(Person p1, Person p2){ Person tmp = new Person(); tmp = p1; p1 = p2; p2 = tmp; }構(gòu)造對象
如果我們想要一個對象, 可以通過 new 關(guān)鍵字構(gòu)造一個對象,這里,我們的 new 會調(diào)用類的構(gòu)造方法(和類同名的無返回值的特殊方法)。
Java 構(gòu)造對象時,通常遵循以下原則:
首先調(diào)用構(gòu)造代碼塊
使用構(gòu)造方法,為實(shí)例變量初始化(基本數(shù)據(jù)類型初始化為類 0 的默認(rèn)值,類類型為 null)
使用 finalize 關(guān)鍵字"析構(gòu)"一個對象(在 gc 之前回收資源)
類的常用方法對于一個 Java 類,我們希望提供以下一些重要的方法:
equals 方法我們一般用 equals() 方法比較兩個對象的引用是否相同。但是,在實(shí)際開發(fā)過程中,這種使用對象引用判斷對象相等似乎沒太大作用,我們更傾向于帶邏輯的相等。如果兩個對象相等,那么這種相等應(yīng)該滿足如下特性:
自反性:如果 x 不為 null,x.equals(x) 為 true
對稱性:如果 x.equals(y),那么 y.equals(x)
傳達(dá)性:如果 x.equals(y),y.equals(z),那么 x.equqls(z)
一致性:如果 x,y 沒有改變,那么 x.equals(y) 一直成立
對于任意非空引用 x,x.equals(null) 應(yīng)該為 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() 方法,便于日志記錄。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68884.html
摘要:本人生性愚鈍,在大學(xué)期間沒能好好領(lǐng)略等面向?qū)ο缶幊痰镊攘Α,F(xiàn)借助一些較為權(quán)威的書籍資料,將基礎(chǔ)知識里比較重要的東西整理成文,命名從基礎(chǔ)學(xué)。如果博文不慎侵犯了您的著作權(quán),請聯(lián)系我。 和很多大學(xué)一樣,我的學(xué)校也是從 Java 、C++ 入手,教給我們面向?qū)ο?(OOP) 的思想。本人生性愚鈍,在大學(xué)期間沒能好好領(lǐng)略 Java 等面向?qū)ο缶幊痰镊攘Α,F(xiàn)借助一些較為權(quán)威的書籍資料,將 Java...
摘要:即接口是用來描述對象具有的某種功能,而不關(guān)心具體實(shí)現(xiàn)。或者說,接口好比服務(wù)商指定的標(biāo)準(zhǔn),由代加工工廠遵守來生產(chǎn)。內(nèi)部類允許在類中定義其它類,這種定義在類中的類叫做嵌套類。局部類是聲明,匿名類是表達(dá)式。匿名類當(dāng)需要聲明字段或其它方法時。 接口 在繼承那篇博文里,我們已經(jīng)簡單了解了 Java 接口的概念。即:接口是用來描述對象具有的某種「功能」,而不關(guān)心具體實(shí)現(xiàn)。或者說,接口好比服務(wù)商指定...
摘要:是一種強(qiáng)類型語言,因此,定義了基本數(shù)據(jù)類型。運(yùn)算符先從運(yùn)算符談起。基本數(shù)據(jù)類的基本數(shù)據(jù)類型同其它高級程序語言比較類似。常用類類型除了一些基本數(shù)據(jù)類型,提供的一些類類型,使用頻率也很高。 Java 是一種強(qiáng)類型語言,因此,Java 定義了基本數(shù)據(jù)類型。同時, Java 和其它高級計算機(jī)語言一樣,有多種運(yùn)算符,這在我們編程過程中極為有用。 運(yùn)算符 先從運(yùn)算符談起。 顧名思義,運(yùn)算符解決的是...
摘要:你只需要相信一句話鍵盤敲爛,月薪過萬就行了,進(jìn)入正文,零基礎(chǔ)入門知識點(diǎn)大綱如下其實(shí)到目前為止,的崗位需求還是非常多的,還是大多數(shù)企業(yè)后臺開發(fā)的主流編程語言,功能強(qiáng)大,還是很值得學(xué)習(xí)的。 ...
摘要:泛型方法泛型類中可以定義靜態(tài)非靜態(tài)的泛型方法。上述泛型類會被替換成下面形式一般使用第一個限定類型替換變?yōu)樵碱愋停瑳]有限定類型,使用替換。 引言 在面向?qū)ο蟮氖澜缋铮覀內(nèi)绻枰粋€容器來盛裝對象。舉個例子:一個籃子。我們可以用這個籃子裝蘋果,也可以用這個籃子裝香蕉。基于 OOP 的思想,我們不希望為蘋果和香蕉分別創(chuàng)建不同的籃子;同時,我們希望放進(jìn)籃子里的是蘋果,拿出來的還是蘋果。于是...
閱讀 3996·2021-09-24 10:24
閱讀 1396·2021-09-22 16:01
閱讀 2718·2021-09-06 15:02
閱讀 1020·2019-08-30 13:01
閱讀 1008·2019-08-30 10:52
閱讀 636·2019-08-29 16:36
閱讀 2237·2019-08-29 12:51
閱讀 2338·2019-08-28 18:29