java 对象与类
類(lèi)與類(lèi)之間的關(guān)系
一、繼承關(guān)系????? 繼承指的是一個(gè)類(lèi)(稱(chēng)為子類(lèi)、子接口)繼承另外的一個(gè)類(lèi)(稱(chēng)為父類(lèi)、父接口)的功能,并可以增加它自己的新功能的能力。在Java中繼承關(guān)系通過(guò)關(guān)鍵字extends明確標(biāo)識(shí),在設(shè)計(jì)時(shí)一般沒(méi)有爭(zhēng)議性。在UML類(lèi)圖設(shè)計(jì)中,繼承用一條帶空心三角箭頭的實(shí)線(xiàn)表示,從子類(lèi)指向父類(lèi),或者子接口指向父接口。?
二、實(shí)現(xiàn)關(guān)系????? 實(shí)現(xiàn)指的是一個(gè)class類(lèi)實(shí)現(xiàn)interface接口(可以是多個(gè))的功能,實(shí)現(xiàn)是類(lèi)與接口之間最常見(jiàn)的關(guān)系。在Java中此類(lèi)關(guān)系通過(guò)關(guān)鍵字implements明確標(biāo)識(shí),在設(shè)計(jì)時(shí)一般沒(méi)有爭(zhēng)議性。在UML類(lèi)圖設(shè)計(jì)中,實(shí)現(xiàn)用一條帶空心三角箭頭的虛線(xiàn)表示,從類(lèi)指向?qū)崿F(xiàn)的接口。?
三、依賴(lài)關(guān)系????? 簡(jiǎn)單的理解,依賴(lài)就是一個(gè)類(lèi)A使用到了另一個(gè)類(lèi)B,而這種使用關(guān)系是具有偶然性的、臨時(shí)性的、非常弱的,但是類(lèi)B的變化會(huì)影響到類(lèi)A。比如某人要過(guò)河,需要借用一條船,此時(shí)人與船之間的關(guān)系就是依賴(lài)。表現(xiàn)在代碼層面,為類(lèi)B作為參數(shù)被類(lèi)A在某個(gè)method方法中使用。在UML類(lèi)圖設(shè)計(jì)中,依賴(lài)關(guān)系用由類(lèi)A指向類(lèi)B的帶箭頭虛線(xiàn)表示。?
四、聚合關(guān)系????? 聚合是關(guān)聯(lián)關(guān)系的一種特例,它體現(xiàn)的是整體與部分的關(guān)系,即has-a的關(guān)系。此時(shí)整體與部分之間是可分離的,它們可以具有各自的生命周期,部分可以屬于多個(gè)整體對(duì)象,也可以為多個(gè)整體對(duì)象共享。比如計(jì)算機(jī)與CPU、公司與員工的關(guān)系等,比如一個(gè)航母編隊(duì)包括海空母艦、驅(qū)護(hù)艦艇、艦載飛機(jī)及核動(dòng)力攻擊潛艇等。
顯式參數(shù)和隱式參數(shù)
? ? ? 顯式參數(shù),就是平時(shí)見(jiàn)到的在方法名括號(hào)中間的參數(shù),就是所謂能看得見(jiàn)的參數(shù)。
? ? ? 隱式參數(shù),是在類(lèi)的方法中調(diào)用了類(lèi)的實(shí)例域。這個(gè)被調(diào)用的實(shí)例域就是隱式參數(shù)。在以下的這個(gè)類(lèi)中調(diào)用了a.ariseSalary(100),就用到了隱式參數(shù)。比如:
?
?
在上面的類(lèi)中,如果調(diào)用了這個(gè)方法salary是實(shí)例域,ariseSalary方法中的salary就是隱式參數(shù)。如果在隱式參數(shù)的前面加上this,隱式參數(shù)就更清晰:
?推薦在隱式參數(shù)的前面加上this操作符。this操作符代表的是本類(lèi)
?
面向?qū)ο蟮奶匦允?#xff1a;封裝,繼承,多態(tài)??
不要在一個(gè)get方法中返回一個(gè)可修改對(duì)象,這樣破壞了封裝,應(yīng)該返回這個(gè)對(duì)象的clone。
一個(gè)方法可以訪(fǎng)問(wèn)它所屬的類(lèi)的所有對(duì)象的私有數(shù)據(jù)。
id是obj對(duì)象私有屬性,但是因?yàn)槭窃赑erson類(lèi)里的方法,而obj是Person對(duì)象,所以可以使用obj.id。
final域
final實(shí)體域
final實(shí)體域必須保證在每一個(gè)構(gòu)造器執(zhí)行之后要被初始化。否則編譯錯(cuò)誤。也就是要么定義的時(shí)候直接賦值,要么在公共構(gòu)造器代碼塊初始化它,要么在每個(gè)構(gòu)造器都初始化它。否則編譯通不過(guò)。
而且構(gòu)造完之后就不能改變了,這里的不能改變是指對(duì)象引用不能變,但是如果這是一個(gè)可變對(duì)象,它的內(nèi)容是不能保證不變的。
所以final一般用在基本數(shù)據(jù)類(lèi)型,或者不可變類(lèi)上。用在可變的類(lèi)上,會(huì)造成混亂。
final靜態(tài)域
和實(shí)體域類(lèi)似,final靜態(tài)域必須在定義的時(shí)候初始化,或者在靜態(tài)代碼塊中初始化。
方法參數(shù)
java語(yǔ)言總是采用值傳遞。也就是說(shuō),方法得到的是所有參數(shù)值的一個(gè)拷貝。
這里說(shuō)的拷貝,是局限在堆棧上的。
對(duì)于基本類(lèi)型很好理解。對(duì)于對(duì)象的話(huà),我們可以理解。
如:我們要把Person p傳遞給一個(gè)方法,其實(shí)我們是這么操作的。
Person p1 = p,然后把p1傳遞過(guò)去。
p1是p在堆棧總的拷貝,但是他們指向同一個(gè)堆的位置。
如果,Person是可變對(duì)象,這個(gè)時(shí)候我們執(zhí)行了p1的方法做了修改,p的內(nèi)容也會(huì)變化。
但是,如果我們,執(zhí)行p1 = new Person,這個(gè)時(shí)候不會(huì)對(duì)p有任何影響。
這就是java所說(shuō)的:值拷貝,方法不能修改傳遞給它的參數(shù)。
值傳遞區(qū)別與c中的引用傳遞,如果是引用傳遞,其實(shí)是把p直接傳遞過(guò)去了。
域的初始化
如果沒(méi)有在構(gòu)造器中對(duì)實(shí)體域進(jìn)行初始化,java會(huì)自動(dòng)初始化。數(shù)字為0,布爾為false,對(duì)象引用為null。
盡量不要這么做。
默認(rèn)構(gòu)造器
僅當(dāng)類(lèi)沒(méi)有提供任何構(gòu)造器的時(shí)候,java會(huì)提供一個(gè)默認(rèn)無(wú)參構(gòu)造器。
構(gòu)造器相互調(diào)用
一個(gè)構(gòu)造器調(diào)用另外一個(gè)通過(guò)this方法,而且必須在構(gòu)造器的第一行代碼,而且只能調(diào)用一個(gè),只能調(diào)用一次。
初始化塊
初始化順序
關(guān)于第二點(diǎn),舉例如下:
結(jié)果為1
如果把初始化塊放到下面:
結(jié)果為0。
靜態(tài)構(gòu)造器
static
{
//靜態(tài)代碼
}
在類(lèi)(不是對(duì)象)初始化的時(shí)候調(diào)用。
finalize方法
finalize方法會(huì)在對(duì)象被垃圾回收之前被調(diào)用,但是何時(shí)被垃圾回收依賴(lài)于不同的垃圾回收機(jī)制,所以不能保證這個(gè)方法什么時(shí)候會(huì)被執(zhí)行,所以盡量不要使用這個(gè)方法。
public private 包作用域
如果沒(méi)有public 也沒(méi)有private 就是包作用域。
類(lèi)上只能投public和包作用域。
如果方法和屬性可以有public ,private和包作用域。
包作用域要求包一模一樣,即使是子包也不可以。
轉(zhuǎn)載于:https://www.cnblogs.com/xiaolang8762400/p/7041465.html
總結(jié)
- 上一篇: 差分约束系统总结(转)
- 下一篇: R语言处理Web数据