內(nèi)部類
內(nèi)部類主要作用
內(nèi)部類提供了更好的封裝,可以吧內(nèi)部類隱藏在外部類之內(nèi),不允許同一個(gè)包中的其他類訪問該類。
內(nèi)部類成員可以直接訪問外部類的私有數(shù)據(jù),因?yàn)閮?nèi)部類被當(dāng)成其外部類成員,同一個(gè)類的成員之間可以互相訪問,但外部類不能訪問內(nèi)部類的實(shí)現(xiàn)細(xì)節(jié)。
匿名內(nèi)部類適合用于創(chuàng)建那些僅需要使用一次的類。
定義內(nèi)部類與外部類的語法大致相同,內(nèi)部類除需要定義在其他類里面之外,還有兩點(diǎn)區(qū)別:
內(nèi)部類比外部類可以多使用三個(gè)修飾符:private protected static - 外部類不可以使用這三個(gè)修飾符。
非靜態(tài)內(nèi)部類不能擁有靜態(tài)成員。
外部類上一級(jí)程序單元是包,所有他只有倆個(gè)作用域:同一個(gè)包和任何位置,public 和包默認(rèn)訪問權(quán)限。而內(nèi)部類的上一級(jí)程序單元是外部類,他就有四個(gè)作用域:同一個(gè)類,同一個(gè)包,父子類和任何位置。
在外部類里使用非靜態(tài)內(nèi)部類時(shí),與平時(shí)使用普通類并沒有太大的區(qū)別。
非靜態(tài)內(nèi)部類可以直接訪問其外部類的private 實(shí)例變量,因?yàn)樵诜庆o態(tài)內(nèi)部類對(duì)象里,保存了一個(gè)它所寄生的外部類對(duì)象的引用,當(dāng)調(diào)用非靜態(tài)內(nèi)部類的實(shí)例方法時(shí),必須有一個(gè)非靜態(tài)內(nèi)部類實(shí)例,非靜態(tài)內(nèi)部類實(shí)例必須寄生在外部類實(shí)例里。
如果外部類成員變量,內(nèi)部類成員變量與內(nèi)部類方法的局部變量同名,則可以通過使用this,外部類類名.this作為限定來區(qū)分。
非靜態(tài)內(nèi)部類的成員只在非靜態(tài)內(nèi)部類范圍內(nèi)是可知的,并不能被外部類直接使用。如果外部類需要訪問非靜態(tài)內(nèi)部類的成員,則必須創(chuàng)建非靜態(tài)內(nèi)部類對(duì)象來調(diào)用訪問其實(shí)例成員。
非靜態(tài)內(nèi)部類對(duì)象和外部類對(duì)象的關(guān)系是什么樣的?
非靜態(tài)內(nèi)部類對(duì)象必須計(jì)生在外部類對(duì)象里,而外部類對(duì)象則不必一定有非靜態(tài)內(nèi)部類對(duì)象寄生其中。簡單來說,如果存在一個(gè)非靜態(tài)內(nèi)部類對(duì)象,則一定存在一個(gè)被他寄生的外部類對(duì)象。但外部類對(duì)象存在時(shí),外部類對(duì)象里不一定寄生了非靜態(tài)內(nèi)部類對(duì)象。因此外部類對(duì)象訪問非靜態(tài)內(nèi)部類成員時(shí),可能非靜態(tài)普通內(nèi)部類對(duì)象根本不存在,而非靜態(tài)內(nèi)部類對(duì)象訪問外部類成員時(shí),外部類地向一定存在。
根據(jù)靜態(tài)成員不能訪問非靜態(tài)成員的規(guī)則,外部類的靜態(tài)方法,靜態(tài)代碼塊不能訪問非靜態(tài)內(nèi)部類,包括不能使用非靜態(tài)內(nèi)部類定義變量,創(chuàng)建實(shí)例等。不允許在外部類的靜態(tài)成員中使用非靜態(tài)內(nèi)部類。
Java不允許在非靜態(tài)內(nèi)部類里定義靜態(tài)成員。
非靜態(tài)內(nèi)部類里不能有靜態(tài)方法,靜態(tài)成員變量,靜態(tài)初始化塊。
靜態(tài)內(nèi)部類就是用static修飾的內(nèi)部類。
Static的作用是把類的成員變成類相關(guān)。而不是實(shí)例相關(guān),即static修飾的成員屬于整個(gè)類,而不屬于單個(gè)對(duì)象。
靜態(tài)內(nèi)部類可以包含靜態(tài)成員,也可以包含非靜態(tài)成員。根據(jù)靜態(tài)成員不能訪問非靜態(tài)成員的規(guī)則,靜態(tài)內(nèi)部類不能訪問外部類的實(shí)例成員,只能訪問外部類的類成員。即使是靜態(tài)內(nèi)部類的實(shí)例方法也不能訪問外部類的實(shí)例成員,只能訪問外部類的靜態(tài)成員。
為什么靜態(tài)內(nèi)部類的實(shí)例方法也不能訪問外部類的實(shí)例屬性呢?
因?yàn)殪o態(tài)內(nèi)部類時(shí)外部類的類相關(guān)的,而不是外部類的對(duì)象相關(guān)的。也就是說靜態(tài)內(nèi)部類對(duì)象不是寄生在外部類的實(shí)例中,而是寄生在外部類的類本身中。當(dāng)靜態(tài)內(nèi)部類對(duì)象存在時(shí),并不存在一個(gè)被他寄生的外部類對(duì)象。靜態(tài)內(nèi)部類對(duì)象只持有外部類的引用,沒有持有外部類對(duì)象的引用。如果允許靜態(tài)內(nèi)部類的實(shí)例方法訪問外部類的實(shí)例成員,但找不到被寄生的外部類的對(duì)象,將產(chǎn)生錯(cuò)誤。
靜態(tài)內(nèi)部類是外部類的一個(gè)靜態(tài)成員,因此外部類的所有方法,所有初始化塊中可以使用靜態(tài)內(nèi)部類來定義對(duì)象,創(chuàng)建對(duì)象等。
外部類依然不能直接訪問靜態(tài)內(nèi)部類的成員,但可以使用靜態(tài)內(nèi)部類的類名作為調(diào)用者來訪問靜態(tài)內(nèi)部類的類成員。也可以使用靜態(tài)內(nèi)部類對(duì)象作為調(diào)用者訪問靜態(tài)內(nèi)部類的實(shí)例成員。
Java允許在接口里面定義內(nèi)部類,接口里定義的內(nèi)部類默認(rèn)使用public static修飾,也就是說,接口內(nèi)部類只能是靜態(tài)內(nèi)部類。
在外部類內(nèi)部使用內(nèi)部類
在外部類內(nèi)部使用內(nèi)部類時(shí),與平常使用普通類沒有太大的區(qū)別。一樣可以直接通過內(nèi)部類類名來定義變量,通過new調(diào)用內(nèi)部類構(gòu)造器來創(chuàng)建實(shí)例。
區(qū)別不要在外部類的靜態(tài)成員中使用非靜態(tài)內(nèi)部類,因?yàn)殪o態(tài)成員不能訪問非靜態(tài)成員。
在外部類內(nèi)部定義內(nèi)部類的子類與平常定義子類也沒有太大的區(qū)別。
在外部類以外使用非靜態(tài)內(nèi)部類
在外部類以外的地方訪問內(nèi)部類包括靜態(tài)和非靜態(tài),則內(nèi)部類不能使用private訪問修飾符,private修飾的內(nèi)部類只能在外部類內(nèi)部使用。對(duì)于使用其他的訪問控制修飾符的說明:
省略訪問控制修飾符的內(nèi)部類,只能被與外部類處于同一包下的其他類所訪問。
使用protected修飾的內(nèi)部類,可被與外部類處于同一包中的其他類和外部類的子類所訪問。
Public修飾的內(nèi)部類,可以在任何地方被訪問。
在外部類以外的地方定義內(nèi)部類語法格式:OutClasss.InnerClass varName
在外部類以外的地方創(chuàng)建非靜態(tài)內(nèi)部類實(shí)例的語法:OutClassInstance.new InnerConstructor()。
非靜態(tài)內(nèi)部類的構(gòu)造器必須使用外部類對(duì)象來調(diào)用。
非靜態(tài)內(nèi)部類的構(gòu)造器必須通過其外部類對(duì)象來調(diào)用。
當(dāng)創(chuàng)建一個(gè)子類時(shí),子類構(gòu)造器總會(huì)調(diào)用父類的構(gòu)造器,因此在創(chuàng)建非靜態(tài)內(nèi)部類的子類時(shí),必須保證讓子類構(gòu)造器可以調(diào)用非靜態(tài)內(nèi)部類的構(gòu)造器,調(diào)用非靜態(tài)內(nèi)部類的構(gòu)造器時(shí),必須存在一個(gè)外部類對(duì)象。
-代碼實(shí)例-
public class Out {
public Out() { System.out.println("Out 構(gòu)造"); } class In{ public In(String name) { System.out.println("In 構(gòu)造 " + name); } }
}
public class SubClass extends Out.In{
public SubClass(Out out, String name) { out.super(name); System.out.println("SubClass 構(gòu)造"); } public static void main(String[] args) { new SubClass(new Out(), "NAME "); //創(chuàng)建本類對(duì)象
// new Out().new In("d"); 創(chuàng)建In的對(duì)象
}
}
Output:
Out 構(gòu)造
In 構(gòu)造 NAME
SubClass 構(gòu)造
如上SubClass的構(gòu)造器中out.super(“name”)中的super代表的是In內(nèi)部類的構(gòu)造器。想創(chuàng)建非靜態(tài)內(nèi)部類的子類,首先需要?jiǎng)?chuàng)建非靜態(tài)內(nèi)部類。但是非靜態(tài)內(nèi)部類的創(chuàng)建必須依賴一個(gè)外部類對(duì)象,所以需要一個(gè)OUT類的對(duì)象。如果是靜態(tài)內(nèi)部類的子類,那么就只需要用super 調(diào)用靜態(tài)內(nèi)部類構(gòu)造器創(chuàng)建子類對(duì)象即可。
非靜態(tài)內(nèi)部類的子類不一定是內(nèi)部類,他可以是一個(gè)外部類。但非靜態(tài)內(nèi)部類的子類實(shí)例一樣需要保留一個(gè)引用,該引用指向其父類所在外部類的對(duì)象。也就是說,如果有一個(gè)內(nèi)部類子類的對(duì)象存在,則一定存在與之對(duì)應(yīng)的外部類對(duì)象。
在外部類以外使用靜態(tài)內(nèi)部類
在外部類以外的地方創(chuàng)建靜態(tài)內(nèi)部類實(shí)例語法new OutClass.InConstructor();
不管是靜態(tài)內(nèi)部類還是非靜態(tài)內(nèi)部類,他們聲明變量的語法完全一樣。區(qū)別就是在創(chuàng)建內(nèi)部類對(duì)象時(shí),靜態(tài)內(nèi)部類只需使用外部類即可調(diào)用構(gòu)造器,而非靜態(tài)內(nèi)部類必須使用外部類對(duì)象來調(diào)用構(gòu)造器。
如果把一個(gè)局部類放在方法里定義,則這個(gè)內(nèi)部類就是一個(gè)局部內(nèi)部類,局部內(nèi)部類僅在該方法里有效,由于局部內(nèi)部類不能在外部類的方法以外的地方使用,因此局部內(nèi)部類也不能使用訪問控制修飾符和static修飾。
匿名內(nèi)部類適合創(chuàng)建于只需要一次使用的類。
匿名內(nèi)部類規(guī)則
匿名內(nèi)部類不能是抽象類,因?yàn)橄到y(tǒng)在創(chuàng)建匿名內(nèi)部類時(shí),會(huì)立即創(chuàng)建匿名內(nèi)部類的對(duì)象,因此不允許將匿名內(nèi)部類定義成抽象類。
匿名內(nèi)部類不能定義構(gòu)造器。由于匿名內(nèi)部類沒有類名,所以無法定義構(gòu)造器,但匿名內(nèi)部類可以定義初始化塊,可以通過實(shí)例初始化來完成構(gòu)造器需要完成的事情。
由于匿名內(nèi)部類不能是抽象類,所以匿名內(nèi)部類必須實(shí)現(xiàn)它的抽象父類或者接口里包含的所有抽象方法。
當(dāng)通過實(shí)現(xiàn)接口來創(chuàng)建匿名內(nèi)部類時(shí),匿名內(nèi)部類也不能顯示創(chuàng)建構(gòu)造器,因此匿名內(nèi)部類只有一個(gè)隱式的無參數(shù)構(gòu)造器,故new接口名后的括號(hào)里不能傳入?yún)?shù)值。抽象類可以根據(jù)構(gòu)造傳遞參數(shù)。
當(dāng)創(chuàng)建匿名內(nèi)部類時(shí),必須實(shí)現(xiàn)接口或抽象父類里的所有抽象方法。如果有需要,可以重寫父類中的普通方法。
Java 8 更加智能:如果局部變量被匿名內(nèi)部類訪問,那么該局部變量相當(dāng)于自動(dòng)使用了final修飾。
被匿名內(nèi)部類訪問的局部變量必須使用final修飾。
Lambda表達(dá)式的目標(biāo)類型必須是“函數(shù)式接口”。函數(shù)式接口代表只包含一個(gè)抽象方法的接口,函數(shù)接口可以包含多個(gè)默認(rèn)方法,類方法,但只能聲明一個(gè)抽象方法。。
Lambda表達(dá)式與匿名內(nèi)部類的主要區(qū)別
匿名內(nèi)部類可以為任意接口創(chuàng)建實(shí)例,不管接口包含多少個(gè)抽象方法,只要匿名內(nèi)部類實(shí)現(xiàn)所有的抽象方法即可,但Lambda表達(dá)式只能為函數(shù)式接口創(chuàng)建實(shí)例。
匿名內(nèi)部類可以為抽象類甚至普通類創(chuàng)建實(shí)例,但Lambda只能為函數(shù)式接口創(chuàng)建實(shí)例。
匿名內(nèi)部類實(shí)現(xiàn)的抽象方法的方法體允許調(diào)用接口中定義的默認(rèn)方法;但Lambda的代碼塊不允許調(diào)用接口中定義的默認(rèn)方法。
枚舉類枚舉類是一種特殊的類,他一樣可以有自己的成員變量和方法。可以實(shí)現(xiàn)一個(gè)或者多個(gè)接口,也可以定義自己的構(gòu)造器。
枚舉類和普通類的區(qū)別
枚舉類可以實(shí)現(xiàn)一個(gè)或者多個(gè)接口,默認(rèn)繼承Enum類,而不是默認(rèn)繼承Object類 ,因此枚舉類不能顯示的繼承其他父類。
使用enum定義,非抽象的枚舉類默認(rèn)會(huì)使用final修飾,因此枚舉類不能派生子類。
枚舉類的構(gòu)造器只能使用private修飾,
枚舉類的所有實(shí)例必須在枚舉類的第一行顯示列出,否則這個(gè)枚舉類永遠(yuǎn)不能產(chǎn)生實(shí)例。系統(tǒng)會(huì)為其默認(rèn)添加public static final修飾。
定義枚舉類時(shí),需要顯示列出所有的枚舉值,以逗號(hào)隔開,枚舉值列列舉借書后以分號(hào)作為結(jié)尾。
枚舉類的實(shí)例只能是枚舉值,
一旦為枚舉類顯示定義了帶參數(shù)的構(gòu)造器,那么枚舉值就必須對(duì)應(yīng)的傳入?yún)?shù)。
獲取枚舉類的枚舉的值可以使用getName方法。
使用implements實(shí)現(xiàn)接口,并實(shí)現(xiàn)接口里包含的抽象方法。
枚舉類里定義抽象方法時(shí)不能使用abstract關(guān)鍵字將枚舉類定義為抽象類,因?yàn)橄到y(tǒng)會(huì)自動(dòng)添加,但因?yàn)槊杜e類需要顯示創(chuàng)建枚舉值,而不是作為父類,所以定義的每個(gè)枚舉值都必須為抽象方法提供實(shí)現(xiàn)。
當(dāng)程序創(chuàng)建對(duì)象,數(shù)組等引用類型實(shí)體時(shí),系統(tǒng)都會(huì)在堆內(nèi)存中為之分配一塊內(nèi)存區(qū),對(duì)象就保留在這塊內(nèi)存區(qū)中,當(dāng)這塊內(nèi)存不再被任何引用變量引用時(shí),這塊內(nèi)存就變成了垃圾,等待垃圾回收機(jī)制回收。
垃圾回收機(jī)制
垃圾回收機(jī)制的特征:
垃圾回收機(jī)制只負(fù)責(zé)堆內(nèi)存中的對(duì)象,不會(huì)回收任何物力資源,如數(shù)據(jù)庫聯(lián)建。網(wǎng)絡(luò)IO
程序無法精確控制垃圾回收的運(yùn)行,垃圾回收會(huì)在合適的時(shí)候進(jìn)行。當(dāng)對(duì)象永久性的失去引用后,系統(tǒng)就會(huì)在合適的時(shí)候回收所占內(nèi)存。
在垃圾回收機(jī)制回收任何對(duì)象之前,總會(huì)先調(diào)用他的finalize方法,該方法可能使該對(duì)象重新復(fù)活,讓一個(gè)引用變量重新引用該對(duì)象,從而導(dǎo)致垃圾回收機(jī)制取消回收。
對(duì)象在內(nèi)存中的狀態(tài)
可達(dá)狀態(tài):即一個(gè)對(duì)象被創(chuàng)建后,若有一個(gè)以上的引用變量引用他,則這個(gè)對(duì)象在程序中處于可達(dá)狀態(tài),程序可通過引用變量來調(diào)用該對(duì)象的實(shí)例變量和方法。
可恢復(fù)狀態(tài):如果程序中某個(gè)對(duì)象不再有任何引用變量引用他,他就進(jìn)入了可恢復(fù)狀態(tài),在這種狀態(tài)下,系統(tǒng)的垃圾回收機(jī)制準(zhǔn)備回收該對(duì)象之前,總會(huì)調(diào)用finalize方法進(jìn)行資源清理,如果方法執(zhí)行后重新讓一個(gè)引用變量指向了該對(duì)象,那么此對(duì)象變成可達(dá)對(duì)象,否則進(jìn)入不可達(dá)狀態(tài)。
不可達(dá)狀態(tài)。當(dāng)對(duì)象與所有引用變量的關(guān)聯(lián)都被切斷,且系統(tǒng)已經(jīng)調(diào)用所有對(duì)象的finalize方法后依然沒有使該對(duì)象變成可達(dá)狀態(tài),那么這個(gè)對(duì)象將永久的失去引用,最后變成不可達(dá)狀態(tài),只有當(dāng)一個(gè)對(duì)象處于不可達(dá)狀態(tài)時(shí),系統(tǒng)才會(huì)真正的回收此對(duì)象所占的資源。
public class Finalizes { public static Finalizes finalizes = null; public static void main(String[] args) { new Finalizes(); System.gc();//建議垃圾回收 1 System.runFinalization();//強(qiáng)制調(diào)用finalize方法。 2 finalizes.info();//并不會(huì)發(fā)生空指針異常 } @Override protected void finalize() throws Throwable { System.out.println("finalize -----");//重寫finalize方法 //這里的this意思是,系統(tǒng)會(huì)調(diào)用所有對(duì)象的finalize方法,那么此this就是系統(tǒng)調(diào)用的對(duì)象。 //由于在上面的main的方法中創(chuàng)建了一個(gè)新的對(duì)象,但是此對(duì)象并沒有指向任何引用變量,此刻他是可恢復(fù)狀態(tài),當(dāng)調(diào)用了此對(duì)象的 //finalize方法后,系統(tǒng)就會(huì)將堆內(nèi)存中的此對(duì)象賦值給類變量finalizes,此刻finalizes已經(jīng)擁有的在堆內(nèi)存中的對(duì)象。 finalizes = this; } private void info() { System.out.println("info"); } }
如上代碼,如果取消了1處代碼,程序并沒有通知系統(tǒng)開始執(zhí)行垃圾回收,而且程序內(nèi)存也沒有緊張、因此系統(tǒng)通常不會(huì)立即進(jìn)行垃圾回收,也就不回調(diào)用創(chuàng)建對(duì)象的finalize方法,這樣類變量依舊保持為null,引發(fā)空指針。如果取消掉2處代碼,由于JVM垃圾回收機(jī)制的不確定性,JVM往往并立刻調(diào)用可恢復(fù)的finalize方法,這樣類變量依舊為null。依舊為空指針異常。
Java語言對(duì)對(duì)象的引用
Java語言對(duì)對(duì)象的引用如下:
強(qiáng)引用StrongReference
程序創(chuàng)建一個(gè)對(duì)象,并把對(duì)象賦給一個(gè)引用變量,程序通過該引用變量來操作實(shí)際的對(duì)象,當(dāng)一個(gè)對(duì)象被一個(gè)或一個(gè)以上的引用變量所引用時(shí),處于可達(dá)狀態(tài),不可能被系統(tǒng)垃圾回收機(jī)制回收,
軟引用SoftReference
當(dāng)一個(gè)對(duì)象只有軟引用時(shí),他有可能被垃圾回收機(jī)制回收,對(duì)于只有軟引用的對(duì)象而言,當(dāng)系統(tǒng)內(nèi)存空間足夠時(shí),他不會(huì)被系統(tǒng)回收,程序也可使用該對(duì)象;當(dāng)系統(tǒng)內(nèi)存不足,系統(tǒng)可能會(huì)回收他,軟引用通常用于對(duì)內(nèi)存敏感的程序中。
弱引用WeakReference
弱引用與軟引用相似,但是比軟引用級(jí)別更低,對(duì)于只有弱引用的對(duì)象而言,當(dāng)系統(tǒng)垃圾回收機(jī)制運(yùn)行時(shí),不管系統(tǒng)內(nèi)存是否足夠,總會(huì)回收該對(duì)象所占用的內(nèi)存。
虛引用PhantomReference
虛引用完全類似沒有引用,虛引用對(duì)對(duì)象本身沒有太大影響,虛引用主要用于跟蹤對(duì)象被垃圾回收的狀態(tài),虛引用不能多帶帶使用,虛引用必須和引用隊(duì)列ReferenceQueue聯(lián)合使用。
引用隊(duì)列用java.lang.ReferenceQueue表示,它用于保存被回收后對(duì)象的引用。當(dāng)聯(lián)合使用軟引用,弱引用和引用隊(duì)列時(shí),系統(tǒng)在回收被引用對(duì)象之后,將把被回收對(duì)象對(duì)應(yīng)的引用添加到關(guān)聯(lián)的引用隊(duì)列中。
與軟引用和虛引用不同的是,虛引用在對(duì)象被釋放之前,將把它對(duì)應(yīng)的虛引用添加到他關(guān)聯(lián)的引用隊(duì)列中,這使得可以在對(duì)象被回收之前采取行動(dòng)。
軟引用和弱引用可以多帶帶使用,但虛引用不能。
虛引用的主要作用就是跟蹤對(duì)象被垃圾回收的狀態(tài),程序可以通過檢查與虛引用關(guān)聯(lián)的引用隊(duì)列中是否已經(jīng)包含了該虛引用,從而了解虛引用所引用的對(duì)象是否即將被回收。
-如下弱引用代碼實(shí)例:-
public class ReferenceT { public static void main(String[] args) { String string = new String("YYYYY"); WeakReferenceweakReference = new WeakReference(string);//弱引用引用字符串YYYYY System.out.println(weakReference.get());//得到弱引用關(guān)聯(lián)的string對(duì)象的值 string = null;//將string引用對(duì)象與堆內(nèi)存中的對(duì)象斷開引用關(guān)系 System.out.println(weakReference.get());//依舊可以輸出 System.gc();//提示進(jìn)行垃圾清理 System.runFinalization();//強(qiáng)制執(zhí)行finalize方法 System.out.println(weakReference.get());//finalize方法執(zhí)行后回收垃圾對(duì)象 } }
采用String string =”String”時(shí),代碼定義字符串時(shí),系統(tǒng)會(huì)使用常量池來管理這個(gè)字符串直接量,會(huì)使用強(qiáng)引用來引用他,系統(tǒng)就不會(huì)回收此字符串直接量了。
-下列虛引用代碼,虛引用無法獲取他所引用的對(duì)象。-
public class PhantomRef { public static void main(String[] args) { String str = new String("啦啦"); //創(chuàng)建隊(duì)列 ReferenceQueue rq = new ReferenceQueue(); //創(chuàng)建虛引用與隊(duì)列和對(duì)象關(guān)聯(lián) PhantomReference pr = new PhantomReference(str, rq); str = null; //虛引用不能取出關(guān)聯(lián)對(duì)象中的值 null System.out.println(pr.get()+" get"); System.gc(); System.runFinalization(); //垃圾清理之后,許引用將被放入引用隊(duì)列中 //true System.out.println(rq.poll() == pr); } }
使用這些引用類可以避免在程序執(zhí)行期間將對(duì)象保留在內(nèi)存中,如果以軟引用,弱引用,或虛引用的方式引用對(duì)象,垃圾回收期就能夠隨意的釋放對(duì)象。
要使用這些特殊的引用類,就不能保留對(duì)對(duì)象的強(qiáng)引用,如果保留了對(duì)對(duì)象的強(qiáng)引用,就會(huì)浪費(fèi)這些引用類所提供的任何好處。
修飾符strictfp含義是FP-strict,就是精確浮點(diǎn)的意思。一旦使用了strictfp來修飾類,方法和接口時(shí),那么在所修飾的范圍內(nèi)java的編譯器和運(yùn)行時(shí)環(huán)境會(huì)完全安裝浮點(diǎn)規(guī)范來執(zhí)行IEEE-754.
Native修飾符主要用于修飾方法,native方法通常使用C語言來實(shí)現(xiàn),如果某個(gè)方法需要利用平臺(tái)相關(guān)特性,或者訪問系統(tǒng)硬件等,那就可以使用native修飾該方法,再交由C去實(shí)現(xiàn)。一旦包含native方法,這個(gè)程序?qū)⑹タ缙脚_(tái)性。
Abstract和final永遠(yuǎn)不能同時(shí)使用,abstract和static不能同時(shí)修飾一個(gè)方法,可以同時(shí)修飾內(nèi)部類。Abstract和private不能同時(shí)修飾方法,可以同時(shí)修飾內(nèi)部類。Private和final同時(shí)修飾方法雖然語言是合法的,但是沒有必要,因?yàn)閜rivate修飾的方法不可能被子類重寫。因此使用final修飾沒意義。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69290.html
摘要:眾多面向?qū)ο蟮木幊趟枷腚m不盡一致,但是無論哪種面向?qū)ο缶幊陶Z言都具有以下的共通功能。原型編程以類為中心的傳統(tǒng)面向?qū)ο缶幊蹋且灶悶榛A(chǔ)生成新對(duì)象。而原型模式的面向?qū)ο缶幊陶Z言沒有類這樣一個(gè)概念。 什么是面向?qū)ο螅窟@個(gè)問題往往會(huì)問到剛畢業(yè)的新手or實(shí)習(xí)生上,也是往往作為一個(gè)技術(shù)面試的開頭題。在這里我們不去談如何答(fu)好(yan)問(guo)題(qu),僅談?wù)勎宜斫獾拿嫦驅(qū)ο蟆?從歷...
摘要:是一種典型的面向?qū)ο缶幊陶Z言。這篇文章主要是來初步理解一下面向?qū)ο蟮乃季S為下面的內(nèi)容先給一個(gè)基礎(chǔ)。針對(duì)面向?qū)ο缶幊痰母鄡?nèi)容,會(huì)在后面的文章里面詳細(xì)解釋。他們都稱之為對(duì)象。之后,我們?cè)儆镁幊陶Z言,把這種映射編寫出來,就是的面向?qū)ο缶幊汤病? showImg(https://segmentfault.com/img/remote/1460000012983458?w=900&h=500);...
摘要:學(xué)編程真的不是一件容易的事不管你多喜歡或是多會(huì)編程,在學(xué)習(xí)和解決問題上總會(huì)碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O(shè)計(jì)和編程的能力掌握基本的優(yōu)化策略。 學(xué)Java編程真的不是一件容易的事,不管你多喜歡或是多會(huì)Java編程,在學(xué)習(xí)和解決問題上總會(huì)碰到障礙。工作的時(shí)間越久就越能明白這個(gè)道理。不過這倒是一個(gè)讓人進(jìn)步的機(jī)會(huì),因?yàn)槟阋恢辈粩嗟膶W(xué)習(xí)才能很好的解決你面前的難題...
摘要:為什么不是面向?qū)ο蟛皇敲嫦驅(qū)ο螅驗(yàn)樗瑐€(gè)原始數(shù)據(jù)類型,例如。自定義類加載器繼承的自定義類加載器。可以像下面這樣指定參數(shù)面試題面向?qū)ο螅惣虞d器,基礎(chǔ)概念它們的關(guān)系如下啟動(dòng)類加載器,實(shí)現(xiàn),沒有父類。自定義類加載器,父類加載器為。 1. 為什么說Java是一門平臺(tái)無關(guān)語言? 平臺(tái)無關(guān)實(shí)際的含義是一次編寫到處運(yùn)行。Java 能夠做到是因?yàn)樗淖止?jié)碼(byte code)可以運(yùn)行在任何操作...
摘要:為什么不是面向?qū)ο蟛皇敲嫦驅(qū)ο螅驗(yàn)樗瑐€(gè)原始數(shù)據(jù)類型,例如。自定義類加載器繼承的自定義類加載器。可以像下面這樣指定參數(shù)面試題面向?qū)ο螅惣虞d器,基礎(chǔ)概念它們的關(guān)系如下啟動(dòng)類加載器,實(shí)現(xiàn),沒有父類。自定義類加載器,父類加載器為。 1. 為什么說Java是一門平臺(tái)無關(guān)語言? 平臺(tái)無關(guān)實(shí)際的含義是一次編寫到處運(yùn)行。Java 能夠做到是因?yàn)樗淖止?jié)碼(byte code)可以運(yùn)行在任何操作...
閱讀 2282·2021-09-30 09:47
閱讀 2209·2021-09-26 09:55
閱讀 2937·2021-09-24 10:27
閱讀 1533·2019-08-27 10:54
閱讀 959·2019-08-26 13:40
閱讀 2486·2019-08-26 13:24
閱讀 2410·2019-08-26 13:22
閱讀 1719·2019-08-23 18:38