從零學java day4 第五章 面向?qū)ο螅ㄉ希?類和對象

java是面向?qū)ο蟮某绦蛟O計語言,java語言提供了定義類、成員變量、方法等最基本的功能。類可被認為是一種自定義的數(shù)據(jù)類型,可以使用類來定義變量,所有使用類定義的變量都是引用變量,他們將會引用到類的對象。類用于描述客觀世界里某一類對象的共同特征,而對象則是類的具體存在,java程序使用類的構造器來創(chuàng)建該類的對象。

java也支持面向?qū)ο蟮娜筇卣鳎悍庋b、繼承和多態(tài),java提供了private、protected、和public三個訪問控制修飾符來實現(xiàn)良好的封裝,提供了extends關鍵字來讓子類繼承父類,子類繼承父類就可以繼承到父類的成員變量和方法,如果訪問控制允許,子類實例可以直接調(diào)用父類里定義的方法。繼承是實現(xiàn)類服用的重要手段,除此之外,也可通過組合關系來實現(xiàn)這種復用,從某種程度上來看,繼承和組合具有相同的功能。使用繼承關系來實現(xiàn)復用時,子類對象可以直接賦給父類變量,這個變量具有多態(tài)性,編程更加靈活;而利用組合關系來實現(xiàn)復用時,則不具備這種靈活性。

1.類和對象

1)定義類

面向?qū)ο蟮某绦蛟O計過程有兩個重要概念:類(class)和對象(object,也被稱為實例,instance),其中類是某一批對象的抽象,可以把類理解為某種概念;對象才是一個具體存在的實體。

java定義類的簡單語法如下:

[修飾符] class 類名

{

零到多個構造器定義

零到多個成員變量

零到多個方法

}

上面語法格式中,修飾符可以是public、final、abstract,或者完全省略這三個修飾符

從程序可讀性方面來看,java類名必須是一個由一個或多個有意義的單詞連綴而成,每個單詞首字母大寫,其他字母全小寫

對一個類定義而言,可以包含三種最常見的成員:構造器、成員變量和方法,三種成員都可以定義零個或多個。

類里各成員之間的定義順序沒有任何影響,各成員之間可以相互調(diào)用,但需要指出的是,static修飾的成員不能訪問沒有static修飾的成員

成員變量用于定義該類或該類的實例所包含的狀態(tài)數(shù)據(jù),方法則用于定義該類或該類的實例的行為特征或者功能實現(xiàn)。java語言用new關鍵字來調(diào)用構造器,從而返回該類的實例。

構造器是一個類創(chuàng)建對象的根本途徑,如果一個類沒有構造器,這個類通常無法創(chuàng)建實例,因此,java語言提供了一個功能:如果程序員沒有為一個類編寫構造器,則系統(tǒng)會為該類提供一個默認的構造器。一旦程序員為一個類提供了構造器,系統(tǒng)將不再為該類提供構造器。

定義成員變量的語法格式如下:

[修飾符] 類型 成員變量名 [= 默認值];

修飾符:修飾符可以省略,也可以是public、protected、private、static、final,其中public、protected、private三個最多只能出現(xiàn)其中之一,可以與static,final組合起來修飾成員變量

類型:類型可以是java語言允許的任何數(shù)據(jù)類型

成員變量名:成員變量名只要是一個合法的標識符即可,但這只是從語法角度來說的:如果從程序可讀性角度來看,成員變量名應該由一個或多個有意義的單詞連綴而成,第一個單詞首字母小寫,后面每個單詞首字母大寫,其他字母全部小寫,單詞與單詞之間不要使用任何分隔符。

默認值:成員變量還可以指定一個可選的默認值。

定義方法的語法格式如下:

[修飾符] 方法返回值類型 方法名(形參列表)

{


}

修飾符可以省略,也可以是public、protected、private、static、final、abstract、其中public、protected、private三個最多只能出現(xiàn)一個,abstract和final最多只能出現(xiàn)其中之一


static是一個特殊的關鍵字,他可以修飾方法、成員變量等成員。static修飾的成員表明它屬于這個類本身,而不屬于該類的單個實例,因為通常把static修飾的成員變量和方法也稱為類變量、類方法。不使用static修飾的普通方法、成員變量則屬于該類的單個實例,而不屬于該類。因為通常把不使用static修飾的成員變量和方法也稱為實例變量、實例方法。

構造器是一個特殊的方法,定義構造器的語法格式與定義方法的語法格式很像

構造器既不能定義返回值類型,也不能使用void聲明構造器沒有返回值。如果為構造器定義了返回值的類型,或者使用了void,java會把他當成方法來處理。

定義類之后,接下來可使用該類了,java的類大致有如下作用:

定義變量

創(chuàng)建對象

調(diào)用類的類方法或訪問類的類變量。

2).對象的產(chǎn)生和使用

創(chuàng)建對象的根本途徑是構造器,通過new關鍵字來調(diào)用某個類的構造器即可創(chuàng)建這個類的實例。

person p = new person();

static修飾的方法和成員變量,即可通過類來調(diào)用,也可通過實例來調(diào)用;沒有使用static修飾的普通方法和成員變量,只可通過實例來調(diào)用。

3)對象、引用和指針

與數(shù)組類似,類也是一種引用數(shù)據(jù)類型

棧內(nèi)存里的引用變量并未真正存儲對象的成員變量,對象的成員變量數(shù)據(jù)實際村房子啊堆內(nèi)存里,而引用變量只是指向該堆內(nèi)存里的對象。

當一個對象被創(chuàng)建成功以后,這個對象將保存在堆內(nèi)存中,java程序不允許直接訪問堆內(nèi)存中的對象,只能通過該對象的引用操作該對象。也就是說,不管是數(shù)組還是對象,都只能通過引用來訪問他們。

堆內(nèi)存里的對象可以由多個引用,即多個引用變量指向同一個對象

Person p2 = p;把變量p的值賦給p2

如果堆內(nèi)存里的對象沒有任何變量指向該對象,那么程序?qū)o法再訪問該對象,這個對象也就變成了垃圾,

如果希望通知垃圾回收機制回收某個對象,只需切斷該對象的所有引用變量和它之間的關系即可,也就是把這些引用變量賦值為null。

4)對象的this引用

java提供了關鍵字this,this關鍵字總是指向調(diào)用該方法的對象,根據(jù)this出現(xiàn)的位置的不同,this作為對象的默認引用有兩種情形。

構造器中引用該構造器正在初始化對象

在方法中引用調(diào)用該方法的對象。

this關鍵字最大的作用就是讓類中一個方法,訪問該類里的另一個方法或?qū)嵗兞俊?/p>

關鍵字this可以代表任何對象,當this出現(xiàn)在某個方法體中時,它所代表的的對象是不確定的,但它的類型是確定的:它所代表的只能是當前類的實例:只有當這個方法被調(diào)用時,它所代表的對象才被確定下來,:誰在調(diào)用這個方法,this就在代表誰。

java允許對象的一個成員直接調(diào)用另一個成員,可以省略this前綴。

大部分時候,一個方法訪問該類中定義的其他方法、成員變量時加不加this前綴的效果是完全一樣的。

對于static修飾的方法而言,則可以使用類來直接調(diào)用該方法,如果在static修飾的方法中使用this關鍵字,則這個關鍵字就無法指向合適的對象。所以,static修飾的方法中不能使用this引用,由于static修飾的方法不能使用this引用,所以static修飾的方法不能訪問不使用static修飾的普通成員,因此java語法規(guī)定:靜態(tài)成員不能直接訪問非靜態(tài)成員。

省略this只是一種假象,雖然程序員省略了調(diào)用jump()方法之前的this,但實際上這個this依然是存在的。根據(jù)漢語語法習慣,完整的語句至少包括主語、謂語、賓語,在面向?qū)ο蟮氖澜缋铮?、謂、賓的結構完全成立。對于java語言來說,調(diào)用成員變量、方法時,主調(diào)是必不可少的,即使代碼中省略了主調(diào),但實際的主調(diào)依然存在。一般來說,如果調(diào)用static修飾的成員時省略了主調(diào),那么默認使用該類作為主調(diào);如果調(diào)用沒有static修飾的成員時省略了前面的主調(diào),那么默認使用this作為主調(diào)。

沒有static修飾的方法是屬于實例的方法,而不是屬于類的方法,因此必須使用對象來調(diào)用該方法,例如在main()方法中調(diào)用沒有被static修飾的info()方法時,系統(tǒng)相當于使用this作為該方法的調(diào)用者。而main()方法是一個static修飾的方法,static修飾的方法屬于類,而不屬于對象,因此調(diào)用static修飾的方法的主調(diào)總是類本身;如果允許在static修飾的方法中出現(xiàn)this引用,那將導致this無法引用有效的對象,因此程序會編譯錯誤。

java編程時不要使用對象去調(diào)用static修飾的成員變量和方法,而是應該使用類去調(diào)用static修飾的成員變量、方法,如果在其他java代碼中看到對象調(diào)用static修飾的成員變量、方法的情形,則完全可以把這種用法當成假象,將其替換成用類來調(diào)用static修飾的成員變量、方法的代碼。

如果確實需要在靜態(tài)方法中訪問另一個普通方法,則只能重新創(chuàng)建一個對象。

大部分時候,普通方法訪問其他方法、成員變量時無需使用this前綴,但如果方法里有個局部變量和成員變量同名,但程序又需要在該方法里訪問這個被覆蓋的成員變量,則必須使用this前綴。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容