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