小編給大家分享一下如何搞懂Java內(nèi)部類,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
為順義等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及順義網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、成都做網(wǎng)站、順義網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
根據(jù)定義的方式不同,內(nèi)部類分為靜態(tài)內(nèi)部類、成員內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類四種。
1.靜態(tài)內(nèi)部類
定義在類內(nèi)部的靜態(tài)類,就是靜態(tài)內(nèi)部類。
publicclassOut{
privatestaticinta;
privateintb;
publicstaticclassInner{
publicvoidprint(){
System.out.println(a);
}
}
}
1)靜態(tài)內(nèi)部類可以訪問外部類所有的靜態(tài)變量和方法,即使是private的也一樣。
(推薦視頻:java視頻教程)
2)靜態(tài)內(nèi)部類和一般類一致,可以定義靜態(tài)變量、方法、構(gòu)造方法等。
3)其他類使用靜態(tài)內(nèi)部類需要使用“外部類.靜態(tài)內(nèi)部類”方式。如下所示:Out.Innerinner=newOut.Inner();inner.print();
4)Java集合類HashMap內(nèi)部就有一個靜態(tài)內(nèi)部類Entry。Entry是HashMap存放元素的抽象,HashMap內(nèi)部維護(hù)Entry數(shù)組用來存放元素,但是Entry對使用者是透明的。像這種和外部類關(guān)系密切的,且不依賴外部類實例的,都可以使用靜態(tài)內(nèi)部類。
2.成員內(nèi)部類
定義在類內(nèi)部的非靜態(tài)類,就是成員內(nèi)部類。成員內(nèi)部類不能定義靜態(tài)方法和變量(final修飾的除外)。這是因為成員內(nèi)部類是非靜態(tài)的,類初始化的時候先初始化靜態(tài)成員,如果允許成員內(nèi)部類定義靜態(tài)變量,那么成員內(nèi)部類的靜態(tài)變量初始化順序是有歧義的。
publicclassOut{
privatestaticinta;
privateintb;
publicclassInner{
publicvoidprint(){
System.out.println(a);
System.out.println(b);
}
}
}
3.局部內(nèi)部類(定義在方法中的類)
定義在方法中的類,就是局部類。如果一個類只在某個方法中使用,則可以考慮使用局部類。
publicclassOut{
privatestaticinta;
privateintb;
publicvoidtest(finalintc){
finalintd=1;
classInner{
publicvoidprint(){
System.out.println(c);
}
}
}
}
4.匿名內(nèi)部類(要繼承一個父類或?qū)崿F(xiàn)一個接口、直接使用new來生成一個對象的引用)
匿名內(nèi)部類,我們必須要繼承一個父類或?qū)崿F(xiàn)一個接口,當(dāng)然也僅能只繼承一個父類或?qū)崿F(xiàn)一個接口。同時它也是沒有class關(guān)鍵字,這是因為匿名內(nèi)部類是直接使用new來生成一個對象的引用。
1)匿名內(nèi)部類僅能被使用一次,創(chuàng)建匿名內(nèi)部類時,它會立即創(chuàng)建一個該類的實例,該類的定義會立即消失,所以匿名內(nèi)部類時不能夠被重復(fù)使用的。
2)匿名內(nèi)部類不能定義構(gòu)造函數(shù),不能存在任何的靜態(tài)成員變量和靜態(tài)方法。
3)匿名內(nèi)部類中的方法不能是抽象的,它必須要實現(xiàn)接口或繼承父類的所有抽象方法。
4)匿名內(nèi)部類訪問的外部類成員變量或成員方法必須用static修飾,內(nèi)部類可以訪問外部類私有變量和方法。
publicabstractclassBird{
privateStringname;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicabstractintfly();
}
publicclassTest{
publicvoidtest(Birdbird){
System.out.println(bird.getName()+"能夠飛"+bird.fly()+"米");
}
publicstaticvoidmain(String[]args){
Testtest=newTest();
test.test(newBird(){
publicintfly(){
return10000;
}
publicStringgetName(){
return"大雁";
}
});
}
}
以上是“如何搞懂Java內(nèi)部類”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!