全面理解Java類和對象
面向?qū)ο蟮某绦蚴怯蓪ο蠼M成的,每個(gè)對象包含對用戶公開的特定功能部分和隱藏的實(shí)現(xiàn)部分。在面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)中,不必關(guān)心對象的具體實(shí)現(xiàn)。在傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)中,算法是第一位的,數(shù)據(jù)結(jié)構(gòu)是第二位的,即首先確定如何操作數(shù),再考慮如何組織數(shù)據(jù),以方便操作。而OOP則顛倒了這種次序,將數(shù)據(jù)放在第一位,然后再考慮操作數(shù)據(jù)的算法。
一、類
類是構(gòu)造對象的模板和藍(lán)圖。通俗地說,類相當(dāng)于建筑的圖紙,而對象相當(dāng)于建筑物。由類構(gòu)造對象的過程稱為創(chuàng)建對象的實(shí)例。
Java中通過關(guān)鍵字class定義“類”,后跟類名。例如:
class Person{ // 類的主體內(nèi)容 }
定義了一個(gè)Person類。
1.字段和方法
定義一個(gè)類時(shí),可以在類里設(shè)置兩種類型的元素:數(shù)據(jù)成員和成員函數(shù)。其中數(shù)據(jù)成員是一種對象,可以是任何類型。如果是指向?qū)ο蟮木浔瑒t必須初始化這個(gè)句柄,通過構(gòu)造器與一個(gè)實(shí)際對象連接起來。如果是基本數(shù)據(jù)類型,則可以在類定義的位置直接初始化。
每個(gè)對象都為自己的數(shù)據(jù)成員保有存儲空間;數(shù)據(jù)成員不會(huì)在對象之間共享。
class Person{ String name; double salary; }
通過new
關(guān)鍵字創(chuàng)建一個(gè)對象。如:
Person p = new Person();
(1)主成員的默認(rèn)值
某個(gè)主數(shù)據(jù)類型屬于一個(gè)類成員,那么即是不明確進(jìn)行初始化,也可以保證他們獲得一個(gè)默認(rèn)值。
主類型 | 默認(rèn)值 |
Boolean | false |
Char | '\u0000'(null) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
如果一個(gè)變量作為類的成員變量,那么對于主類型一定會(huì)得到初始化,要特別注意初始化的值。對于局部變量則會(huì)得到一些隨機(jī)值,如:int x;
不會(huì)自動(dòng)初始化為0。
(2)方法
方法的基本組成部分包括名字、自變量、返回類型以及主體。方法的基本形式為:
返回類型 方法名(/*自變量列表*/) {/* 方法體 */}
返回類型是指調(diào)用方法之后返回的數(shù)值類型。方法名是對具體方法的標(biāo)識和引用。自變量列表列出****了想傳遞給方法的信息類型和名稱。
在Java中方法的調(diào)用形式為對象名.方法名
1. 用句柄操作對象
盡管Java是完全面向?qū)ο蟮?/strong>。但是,操作的標(biāo)識符實(shí)際指向一個(gè)對象的“句柄”,又稱“引用”。句柄是可以獨(dú)立存在的,并不是說,擁有一個(gè)句柄就必須有一個(gè)對象與之對應(yīng)。比如,int i;
定義了一個(gè)整型變量i,并不表示它一定有值。如,創(chuàng)建一個(gè)String類型的句柄:
String s;
這里只是創(chuàng)建了句柄,并沒有創(chuàng)建對象。由于s并沒有與之關(guān)聯(lián)的對象,如果調(diào)用s將出現(xiàn)異常。所以,創(chuàng)建時(shí)需要進(jìn)行初始化。
String s = "hello";
在Java中,通過new關(guān)鍵字創(chuàng)建對象,它將返回對象的引用(即句柄)。所以
String s = new String("hello");
創(chuàng)建了一個(gè)內(nèi)容為"hello"的String對象,并將該對象的句柄(引用)交給了s保存。
2. 數(shù)據(jù)存儲的位置
1.寄存器。最快的保存區(qū)域,位于處理器內(nèi)部。寄存器的大小有限,由編譯器的分配大小。
2.堆棧。駐留在常規(guī)RAM(隨機(jī)訪問存儲器)區(qū)域,通過“堆棧指針”可以改變大小。堆棧指針向下移動(dòng),會(huì)創(chuàng)建新的內(nèi)存空間;向上移動(dòng),則釋放內(nèi)存空間。創(chuàng)建程序時(shí),Java編譯器必須準(zhǔn)確地知道堆棧內(nèi)保存的所有數(shù)據(jù)的“長度”和“存在的時(shí)間”,編譯器由此生成相應(yīng)的代碼,以便移動(dòng)指針。Java對象的句柄保存在其中,但是Java對象并不保存在堆棧中。
3.堆。常規(guī)用途的內(nèi)存池,其中保存了Java對象。編譯器不知道也不需要知道從“內(nèi)存堆”或“堆”里分配多少存儲空間、數(shù)據(jù)存留多長時(shí)間。
4.靜態(tài)存儲。靜態(tài)指位于固定的位置(在RAM中)。程序運(yùn)行期間,靜態(tài)存儲的數(shù)據(jù)將隨時(shí)供調(diào)用。通過static關(guān)鍵字指出一個(gè)對象的特定元素是靜態(tài)的。Java本身本不可能置于靜態(tài)存儲空間。
5.常數(shù)存儲。常數(shù)值通常置于程序代碼內(nèi)部,永遠(yuǎn)不會(huì)改變。
6.非RAM存儲。若數(shù)據(jù)完全獨(dú)立于一個(gè)程序之外,則程序不運(yùn)行時(shí)仍可存在,并在程序的控制范圍之內(nèi)。例如,流式對象和固定對象。
二、對象
對象的三個(gè)主要特性:
•對象的行為——可以對對象施加哪些操作,或可以對對象施加哪些方法?
•對象的狀態(tài)——當(dāng)時(shí)加那些方法時(shí),對象如何響應(yīng)?
•對象標(biāo)識——如何辨別具有相同行為與狀態(tài)的不同對象?
對象的行為是由可調(diào)用的方法定義的。每個(gè)對象都保存著描述當(dāng)前特征的信息,這就是對象的狀態(tài)。對象的狀態(tài)不會(huì)自發(fā)改變。一個(gè)設(shè)計(jì)良好的類,它的對象只能通過調(diào)用方法實(shí)現(xiàn),如果不經(jīng)過方法調(diào)用就可以改變對象的狀態(tài),說明封裝性受到了破壞。
封裝:將數(shù)據(jù)和行為組合在一個(gè)包中,并對對象的使用者隱藏了數(shù)據(jù)的實(shí)現(xiàn)方法。封裝的關(guān)鍵在于絕對不能讓類中的方法直接地訪問其他類的實(shí)例域。程序僅通過對象的方法域?qū)ο髷?shù)據(jù)進(jìn)行交互。
對象中的數(shù)據(jù)稱為實(shí)例域(instance field)或?qū)傩?。操縱數(shù)據(jù)的過程稱為方法(method)。對于每個(gè)特定的對象都有一組特定的實(shí)例域值(屬性值),這些值的集合就是該對象的當(dāng)前狀態(tài)。
類之間的關(guān)系
類之間常見的關(guān)系:
•依賴(“use-a”): 一個(gè)類的方法操縱另一個(gè)類的對象。
•聚合(“has-a”): 一個(gè)類的對象包含另一個(gè)類的對象。
•繼承(“is-a”): 用于表示特殊與一般的關(guān)系。如果類A擴(kuò)展類B(A繼承B),類A不但包含類B的方法,還有擴(kuò)展的方法。
一個(gè)對象并沒有實(shí)際包含一個(gè)對象,而僅僅引用一個(gè)對象。
在Java中,任何對象變量的值都是都是對存儲在另外一個(gè)地方的一個(gè)對象的引用。new操作符的返回值也是一個(gè)引用。
以上這篇全面理解Java類和對象就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Spring Cloud 本地屬性覆蓋的問題
這篇文章主要介紹了關(guān)于Spring Cloud 本地屬性覆蓋的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03利用HttpUrlConnection 上傳 接收文件的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄肏ttpUrlConnection 上傳 接收文件的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11SpringBoot JPA出現(xiàn)錯(cuò)誤:No identifier specified&nb
這篇文章主要介紹了SpringBoot JPA出現(xiàn)錯(cuò)誤:No identifier specified for en解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot實(shí)現(xiàn)多種來源的Zip多層目錄打包下載
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何實(shí)現(xiàn)多種來源的?Zip?多層目錄打包下載,包括本地文件和HTTP混合,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04springboot實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07