摘要:類最基本的作用,在于通過類獲取到相應(yīng)的對象,在向?qū)ο蟀l(fā)送消息時(shí)以期望對象做某些特定的事情。先導(dǎo)概念引用中一切皆對象,因此采用一個(gè)指向?qū)ο蟮囊脕聿倏v對象。對象可以存活于作用域之外。
歡迎各位讀者關(guān)注我的微信公眾號,共同探討Java相關(guān)技術(shù)。生命不止,學(xué)習(xí)不休!
也許你慢慢地對程序有了這樣的認(rèn)識:程序只是一些列帶有方法的對象的組合,這些方法以其它對象為參數(shù),可在任何地方返回,并發(fā)送消息給其他對象。這樣的認(rèn)識,目前來說,是對的。一覽焦點(diǎn)
Java中的類
新建的對象去了哪里
誰來安置無家可歸的對象
總結(jié)
Java中的類決定了對象的外觀與行為。Java中用class關(guān)鍵字來對類進(jìn)行定義。
在Java中,允許程序員定義一個(gè)新的數(shù)據(jù)類型來滿足其應(yīng)用的需求。其形式為class后跟上新類型的名稱。比如:
class NewTypeName { //class definition }
通過以上代碼,你就定義了一個(gè)新的名為NewTypeName的數(shù)據(jù)類型。類型名稱可以由程序員自己定義,而class關(guān)鍵字是必須的、大小寫敏感的,一定不能寫錯。但是單純地定義一個(gè)空類定義的類,是沒有任何意義的。
類最基本的作用,在于通過類獲取到相應(yīng)的對象,在向?qū)ο蟀l(fā)送消息時(shí),以期望對象做某些特定的事情。
在對類進(jìn)行定義后,就可以在類中設(shè)置以下兩種類型的元素:字段和方法。
先導(dǎo)概念
引用:Java中一切皆對象,因此采用一個(gè)指向?qū)ο蟮?b>引用來操縱對象。
引用具有操作對象的能力
引用不一定需要有一個(gè)對象與之關(guān)聯(lián)
基本數(shù)據(jù)類型:Java中對于小而簡單的變量,采用對象的形式表示會導(dǎo)致原本輕量的變量變得無比厚重且耗費(fèi)內(nèi)存空間。所以Java中定義了8種基本數(shù)據(jù)類型,其直接存儲值,并置于虛擬機(jī)棧中。每種基本數(shù)據(jù)類型所占存儲空間大小恒定不變。
所有數(shù)值類型都有正負(fù)號
boolean類型所占用的存儲空間的大小沒有明確指定,僅能取字面值true或false
基本數(shù)據(jù)類型都有其對應(yīng)的包裝類型
對于高精度的數(shù)字,需要用BigInteger(支持任何精度的整數(shù))或BigDecimal(支持任何精度的定點(diǎn)數(shù))來表示,二者沒有對應(yīng)的基本類型
基本數(shù)據(jù)類型如下表
基本類型 | 大小 | 包裝類型 |
---|---|---|
boolean | - | Boolean |
char | 16bit | Character |
byte | 8bit | Byte |
short | 16bit | Short |
int | 32bit | Integer |
long | 64bit | Long |
float | 32bit | Float |
double | 64bit | Double |
字段
字段可以是基本數(shù)據(jù)類型中的一種,也可以是任何類型的對象,可以通過其引用與其所指向的對象。如果是對某個(gè)對象的引用,那么必須通過初始化使其與一個(gè)實(shí)際的對象關(guān)聯(lián)。
如何引用對象中的某個(gè)字段
對象名稱.字段名稱
示例
class NewTypeName { int i; int j; int k; public static void main(String [] args) { NewTypeName type = new NewTypeName(); //此處type是對象的名稱,其是一個(gè)引用,i/j/k分別是NewTypeName這個(gè)類中的字段 type.i = 1; type.j = 2; type.k = 3; } }
基本成員默認(rèn)值
如果是基本數(shù)據(jù)類型并作為類的成員使用時(shí),即使沒有初始化,也會確保其有一個(gè)默認(rèn)值,默認(rèn)值如下表所示:
基本類型 | 默認(rèn)值 |
---|---|
boolean | false |
char | "u0000"(null) |
byte | 0 |
short | 0 |
int | 0 |
long | 0l |
float | 0.0f |
double | 0.0d |
如果是基本類型且作為方法的局部變量使用時(shí),獲取的默認(rèn)值可能為人一直
如果是引用類型,在沒有進(jìn)行初始化的情況下,默認(rèn)為null
方法
Java中方法用來表示用用來做某些事情的方式。方法的基本構(gòu)成部分包括:方法名稱、參數(shù)、返回值和方法體
一個(gè)方法的基本形式
ReturnType methodName(String arg1, Integer arg2) { /* Method Body */ }
構(gòu)件解析
返回類型:描述方法在調(diào)用之后返回的值
方法名稱:程序員自定義的方法的名稱
參數(shù)列表:描述了要從外部傳遞給方法體的參數(shù)的類型和名稱
方法體:描述一個(gè)方法實(shí)際要做的事情
方法名稱和參數(shù)列表合起來稱為“方法簽名”,其唯一確定地標(biāo)識出某個(gè)方法
在Java中,參數(shù)總是以值的形式進(jìn)行傳遞。如果是基本數(shù)據(jù)類型,則傳遞的是類型的真值;如果是引用類型,則傳遞的是引用的值。Java中不存在引用傳遞。
return關(guān)鍵字在Java的方法中表示返回,存在如下兩種情況:
如果返回類型不為void,則在return后要跟上與返回類型相兼容的值
如果返回類型為void,則return關(guān)鍵字的作用只是用來退出方法,不必在return后跟任何返回值
新建的對象去了哪里在Java中,創(chuàng)建了一個(gè)引用變量后,最安全的方案就是為其綁定一個(gè)實(shí)際存在的對象,能有效防止惱人的NullPointerException(空指針異常);
Java中通過new操作符來實(shí)現(xiàn)對象的創(chuàng)建,其基本形式為:
new NewTypeName();
其中new關(guān)鍵字,表示向堆中申請內(nèi)存;NewTypeName表示一個(gè)數(shù)據(jù)類型,在申請到內(nèi)存空間后,會以這個(gè)數(shù)據(jù)類型為模板進(jìn)行對象的實(shí)例化;實(shí)例化完成后,會對對象中的字段進(jìn)行默認(rèn)值填充。
在Java中有5個(gè)不同的地方可以進(jìn)行數(shù)據(jù)存儲:
寄存器:位于處理器內(nèi)部,是最快的存儲區(qū),不能由程序進(jìn)行直接控制
虛擬機(jī)棧:位于隨機(jī)訪問存儲器(RAM)中,通過棧指針的移動進(jìn)行內(nèi)存分配以及內(nèi)存回收,遵循上釋放下分配的原則;這一區(qū)域主要存放基本數(shù)據(jù)類型及數(shù)據(jù)引用
堆:位于RAM中,是一種通用的存儲池,對象存儲的地方。在此處,編譯器不需要知道存儲的數(shù)據(jù)在堆里的生命周期,而由垃圾回收期進(jìn)行管理
常量存儲:常量值通常直接存放在程序代碼內(nèi)部
非RAM存儲:可完全存活于程序外的數(shù)據(jù)。如流對象和持久化對象
誰來安置無家可歸的對象無家可歸的對象,意味著沒有引用指向該對象,該對象找不到它的歸屬。
在大多數(shù)語言中,都存在作用域的概念。作用域決定了在其內(nèi)部定義的變量名的可見性和生命周期。在Java中不允許嵌套的作用域中,較小的作用域擁有與較大的作用域相同的變量,如下代碼無法通過編譯:
//此處的代碼無法實(shí)際運(yùn)行,只做演示 { int x = 11; { int x = 12; } }
Java中貫徹了一切都是對象的觀念。對象不具備和基本數(shù)據(jù)類型一樣的生命周期。對象可以存活于作用域之外。
如以下代碼:
{ String s = new String("Hello World"); }//運(yùn)行到這里,s已經(jīng)在作用域之外
在上述代碼中,在超過作用域之后,引用變量s的生命周期已經(jīng)結(jié)束,但"Hello World"這個(gè)String對象卻依舊存在。其生存于堆中,只是我們再沒有引用變量來指向這個(gè)對象了,因此這個(gè)對象對于我們來說是不可見的。
那么另外一個(gè)問題是,Java是如何來保障這些沒有引用變量指向的對象不會把內(nèi)存塞爆的呢?Java采用了垃圾回收器,用來監(jiān)視所有用new關(guān)鍵字創(chuàng)建的對象,如果一個(gè)對象不再被引用,那么垃圾收集器便會在隨后的內(nèi)存回收活動中銷毀該對象,并釋放其所占用的內(nèi)存。因此,Java程序員是不需要太在乎內(nèi)存的回收的。
總結(jié)本文主要以Java的類為切入點(diǎn),描述了從類到對象的創(chuàng)建,然后到對象的存放和銷毀的整個(gè)流程。由于我們大多數(shù)的時(shí)間都是在創(chuàng)建新的類來滿足我們的業(yè)務(wù)需求,因此一個(gè)類的內(nèi)部結(jié)構(gòu)異常重要,好的結(jié)構(gòu)能最大化地提升程序運(yùn)行效率。這涉及到后面講解的設(shè)計(jì)模式,在此只對類的構(gòu)成作一個(gè)了解。
在下一節(jié)中,我們嘗試運(yùn)用目前已學(xué)習(xí)的內(nèi)容,來完成我們的第一個(gè)Java程序。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/77432.html
摘要:而面向?qū)ο髣t是向程序員提供表示問題空間中元素的工具,我們將問題空間中的元素及其在解空間中的表示稱為對象。為什么要把對象看作是服務(wù)提供者呢這是將問題分解為對象集合的一種合理方式。職能太多,可能會導(dǎo)致對象的內(nèi)聚性降低。在試圖將子類對象當(dāng)作其基類 計(jì)算機(jī)是頭腦延伸的工具,是一種不同類型的表達(dá)媒體。本文以背景性的和補(bǔ)充性的材料,介紹包括開發(fā)方法概述在內(nèi)的面向?qū)ο蟪绦蛟O(shè)計(jì)(Object-orie...
摘要:本書概括以軟件系統(tǒng)為例,重點(diǎn)講解了應(yīng)用架構(gòu)中的物理設(shè)計(jì)問題,即如何將軟件系統(tǒng)拆分為模塊化系統(tǒng)。容器獨(dú)立模塊不依賴于具體容器,采用輕量級容器,如獨(dú)立部署模塊可獨(dú)立部署可用性模式發(fā)布接口暴露外部配置使用獨(dú)立的配置文件用于不同的上下文。 本文為讀書筆記,對書中內(nèi)容進(jìn)行重點(diǎn)概括,并將書中的模塊化結(jié)合微服務(wù)、Java9 Jigsaw談?wù)劺斫狻?本書概括 以Java軟件系統(tǒng)為例,重點(diǎn)講解了應(yīng)用架構(gòu)...
摘要:當(dāng)我們希望能界定這二者之間的區(qū)別時(shí),我們將第一種稱為純粹的函數(shù)式編程,后者稱為函數(shù)式編程。函數(shù)式編程我們的準(zhǔn)則是,被稱為函數(shù)式的函數(shù)或方法都只能修改本地變量。另一種觀點(diǎn)支持引用透明的函數(shù)式編程,認(rèn)為方法不應(yīng)該有對外部可見的對象修改。 一、實(shí)現(xiàn)和維護(hù)系統(tǒng) 1.共享的可變數(shù)據(jù) 如果一個(gè)方法既不修改它內(nèi)嵌類的狀態(tài),也不修改其他對象的狀態(tài),使用return返回所有的計(jì)算結(jié)果,那么我們稱其為純粹...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 1304·2021-11-11 16:54
閱讀 946·2021-10-19 11:44
閱讀 1405·2021-09-22 15:18
閱讀 2523·2019-08-29 16:26
閱讀 3019·2019-08-29 13:57
閱讀 3164·2019-08-26 13:32
閱讀 1157·2019-08-26 11:58
閱讀 2405·2019-08-26 10:37