<meta charset="utf-8">
1 構(gòu)造器
不接受任何參數(shù)的構(gòu)造器叫做默認(rèn)構(gòu)造器躁绸,如果沒(méi)有編寫(xiě)構(gòu)造器,則會(huì)自動(dòng)創(chuàng)建無(wú)參構(gòu)造器臣嚣。如果有構(gòu)造器净刮,則不會(huì)自動(dòng)創(chuàng)建無(wú)參構(gòu)造器。
方法覆蓋:返回值類型茧球,參數(shù)個(gè)數(shù)庭瑰,參數(shù)類型都必須相同,且權(quán)限要大于等于父類權(quán)限
2 方法重載
方法名相同抢埋,形式參數(shù)不同。每一個(gè)重載的方法都必須有一個(gè)獨(dú)一無(wú)二的參數(shù)類型列表督暂。
參數(shù)順序也可以區(qū)分方法揪垄,但是會(huì)使代碼難以維護(hù)。
不可以用返回值區(qū)分重載方法逻翁。重載方法可以有不同的返回值饥努,但是參數(shù)列表一定不相同
void f(){}
int f(){}
如果可以上述例子的話,我們調(diào)用f() 并不知道調(diào)用哪個(gè)方法八回,所以沒(méi)有辦法區(qū)分方法酷愧。
涉及基本類型的重載
1 基本類型能從一個(gè)較小的類型自動(dòng)提升到一個(gè)較大的類型,此過(guò)程一旦牽涉到重載缠诅,可能會(huì)造成一些混淆溶浴。
三條規(guī)則
- char byte short int long float double默認(rèn)找最小類型,沒(méi)有的話則提升
- char如果沒(méi)有找到char參數(shù)的方法管引,會(huì)直接提升至int
- byte short 一步一步提升士败,比如,如果沒(méi)有接收byte的參數(shù)方法 褥伴,但是有接收short參數(shù)的方法谅将,則會(huì)把byte提升到short。并調(diào)用接收short參數(shù)的方法
2 傳入的實(shí)際參數(shù)大于重載方法聲明的形式參數(shù)重慢,需要強(qiáng)制轉(zhuǎn)換較小的類型饥臂,進(jìn)行窄化轉(zhuǎn)換,不然編譯器就會(huì)報(bào)錯(cuò)
3 this關(guān)鍵字
只能在方法內(nèi)部使用似踱,表示對(duì)“調(diào)用方法的那個(gè)對(duì)象”的引用隅熙。
如果在方法內(nèi)部調(diào)用同一個(gè)類的另一個(gè)方法稽煤,不必使用this,直接調(diào)用即可猛们。當(dāng)前方法中的this引用會(huì)自動(dòng)應(yīng)用于同一類中的其他方法念脯。
public class A{
void pick)()
void pit(){ pick();}
}
可以寫(xiě)this.pick()但沒(méi)有必要,會(huì)自動(dòng)添加
用法:
1 返回對(duì)象引用 return this;
2 將當(dāng)前對(duì)象傳遞給其他方法: return Peller.peel(this); 調(diào)用另一個(gè)類的靜態(tài)方法弯淘,并把該類的對(duì)象傳遞過(guò)去绿店。
3 構(gòu)造器中調(diào)用構(gòu)造器:為了避免重復(fù)代碼。但是要注意的是庐橙,必須將構(gòu)造器調(diào)用置于最開(kāi)始處假勿,且只能用this調(diào)用一個(gè)構(gòu)造器,不能調(diào)用兩個(gè)态鳖。
4 帶表數(shù)據(jù)成員:this.s
4 static 的含義
static方法中沒(méi)有this转培。不能調(diào)用非靜態(tài)方法。而非靜態(tài)方法可以調(diào)用靜態(tài)方法浆竭。
5清理:終極處理和垃圾回收
finalize() 方法浸须,清理未使用對(duì)象(new)獲得的內(nèi)存資源。
垃圾回收三點(diǎn)概念
- 對(duì)象可能不被垃圾回收:存儲(chǔ)空間沒(méi)有用完邦泄,對(duì)象就總也得不到釋放删窒。
- 垃圾回收并不等于“析構(gòu)”
- 垃圾回收只與內(nèi)存有關(guān):回收程序不再使用的內(nèi)存。
垃圾回收如何工作
垃圾回收對(duì)于提高對(duì)象的創(chuàng)建速度顺囊,有明顯的效果肌索。存儲(chǔ)空間的釋放會(huì)影像存儲(chǔ)空間的分配。java從堆分配空間的速度特碳,可以和其他語(yǔ)言從堆棧上分配空間的速度相媲美诚亚。
引用計(jì)數(shù)法:是一種簡(jiǎn)單但速度很慢的垃圾回收技術(shù),常用來(lái)說(shuō)明垃圾收集的工作方式午乓,但似乎從未被應(yīng)用于任何一種java虛擬機(jī)中站宗。
工作方式:每個(gè)對(duì)象含有一個(gè)引用計(jì)數(shù)器,當(dāng)引用連接對(duì)象硅瞧,引用計(jì)數(shù)加1份乒,引用離開(kāi)作用域或置為null,引用計(jì)數(shù)減1腕唧。引用計(jì)數(shù)為0時(shí)或辖,就釋放器占用的空間。
缺陷:如果對(duì)象質(zhì)檢存在循環(huán)引用枣接,可能會(huì)出現(xiàn)“對(duì)象應(yīng)該被回收颂暇,但引用計(jì)數(shù)卻為0”的情況。
另一種方式思想是:對(duì)任何活的對(duì)象但惶,一定能追溯到活在堆椂欤或靜態(tài)存儲(chǔ)區(qū)之中的引用湿蛔。由此如果從堆棧和靜態(tài)存儲(chǔ)區(qū)開(kāi)始,遍歷所有的引用县爬,就能找到所有活的對(duì)象阳啥。
對(duì)于發(fā)現(xiàn)的每個(gè)引用,必須追蹤它所引用的對(duì)象财喳,然后是此對(duì)象包含的所有引用察迟,如此反復(fù)下去,直到訪問(wèn)全部停止耳高。
基于上述思想是目前java虛擬機(jī)采用的思想扎瓶,由此得到自適應(yīng)垃圾回收技術(shù)
1 停止-復(fù)制(stop-and-copy) :先暫停程序的運(yùn)行,然后將所有存活的對(duì)象從當(dāng)前堆復(fù)制到另一個(gè)堆泌枪,沒(méi)有被賦值的全部都是垃圾概荷。復(fù)制新的堆的時(shí)候,保持緊密排列
這種方式效率低碌燕,原因:兩個(gè)堆之間來(lái)回挪動(dòng)误证,需要很多的空間,2 產(chǎn)生少量的垃圾時(shí)修壕,這種方式會(huì)非常浪費(fèi)
2標(biāo)記-清掃(mark-and-sweep):從堆棧和靜態(tài)存儲(chǔ)區(qū)出發(fā)雷厂,遍歷所有引用,找出存活的對(duì)象叠殷。每當(dāng)它找到一個(gè)活的對(duì)象,就給對(duì)象設(shè)置一個(gè)標(biāo)記诈皿。當(dāng)所有標(biāo)記工作完成時(shí)林束,清理
動(dòng)作才會(huì)開(kāi)始。沒(méi)有標(biāo)記的對(duì)象稽亏,將被釋放壶冒,不會(huì)發(fā)生任何復(fù)制動(dòng)作。所以剩下的堆空間是不連續(xù)的
兩個(gè)方法都必須在程序暫停的情況下進(jìn)行截歉。
對(duì)于第一個(gè)方法(stop-and-copy)胖腾,一些虛擬機(jī)解決方案是,內(nèi)存分配以較大的“塊”為單位瘪松。如果對(duì)象交大咸作,它會(huì)占用單獨(dú)的塊。每個(gè)塊都用相應(yīng)的代數(shù)記錄它是否存活宵睦。
如果塊在某處被引用记罚,代數(shù)就會(huì)增加。垃圾回收器將對(duì)上次回收動(dòng)作之后信分配的塊進(jìn)行整理壳嚎。這對(duì)處理大量短命的對(duì)象很有幫助桐智。垃圾回收器會(huì)定期進(jìn)行完整的清理
動(dòng)作--大型對(duì)象仍然不會(huì)被賦值(只是代數(shù)會(huì)增加)末早,內(nèi)含小型對(duì)象的那些塊則被賦值并整理。
如果所有對(duì)象都很穩(wěn)定说庭,垃圾回收器效率低的化然磷,就從停止-復(fù)制 切換到 標(biāo)記-清掃 方式。標(biāo)記清掃出現(xiàn)太多的垃圾碎片則再切換回停止-復(fù)制 方式刊驴。
6 初始化
初始化順序
1 靜態(tài)變量>成員變量>構(gòu)造器,
2 按照聲明順序初始化
靜態(tài)變量在類首次加載時(shí)初始化姿搜,并且只初始化一次。 成員變量和構(gòu)造器在new一個(gè)對(duì)象時(shí)初始化缺脉,可以初始化多次
靜態(tài)變量只占用一份存儲(chǔ)區(qū)域痪欲,static關(guān)鍵字不能應(yīng)用于局部變量。
顯示的靜態(tài)初始化-------靜態(tài)代碼塊攻礼,只執(zhí)行一次
非靜態(tài)實(shí)例初始化-------代碼塊业踢,用來(lái)初始化每一個(gè)對(duì)象的非靜態(tài)變量,這種語(yǔ)法對(duì)于支持“匿名內(nèi)部類”的初始化是必須的礁扮,在構(gòu)造器之前執(zhí)行知举。
數(shù)組初始化
-
Integer[] a = new Integer[數(shù)量]
初始化數(shù)組,并指定數(shù)組大小太伊。為其分配內(nèi)存空間雇锡,并初始化0 或null 或false。 -
Integer [] a = {}
在定義數(shù)組時(shí)就得指定元素僚焦, -
Integer[] a = new Integer[]{}
這種方式不需要在定義數(shù)組引用時(shí)就初始化锰提。比如
a = new Integer[] {}; 可以分開(kāi)。是最靈活的初始化方式
可變參數(shù)列表
void printArray(Object... args) 該參數(shù)接收下面三種參數(shù)芳悲,并轉(zhuǎn)化成數(shù)組
1 傳多個(gè)參數(shù) printArray(1, 2, 3, 4)
2 傳一個(gè)數(shù)組 printArray((Object[]) new Integer[]{1, 2, 3, 4})
3 傳空List printArray()
重載時(shí)立肘,會(huì)出現(xiàn)問(wèn)題
void f(Character... args)
void f(Long... args)
void f(Integer... args)
此時(shí)我們不能使用空參調(diào)用方法,這樣會(huì)沒(méi)法編譯
void f(float, Character... args)
void f(Character... args)
上面方法不可以名扛,會(huì)報(bào)錯(cuò)
void f(float i, Character... args)
void f(char c, Character...args)
此方法為正確解法
重點(diǎn):所以谅年,我們應(yīng)該只在重載方法的一個(gè)版本上使用可變參數(shù)列表,或者壓根就不使用它
7 枚舉類型
public enum Spiciness{
NOT, MILD, MEDIUM
}
Spiciness s = Spiciness.MEDIUM;
for(Spiciness s : Spiciness.values()){ // 返回所有枚舉值
s.ordinal(); // s.ordinal() 枚舉的整數(shù)值
}
可以與switch一起使用
Spiciness degree
switch(degree){
case NOT: statement;
default: statement;
}