柚子快報激活碼778899分享:java內(nèi)部類的本質(zhì)
柚子快報激活碼778899分享:java內(nèi)部類的本質(zhì)
定義在類內(nèi)部,可以實現(xiàn)對外部完全隱藏,可以有更好的封裝性,代碼實現(xiàn)上也往往更為簡潔。
內(nèi)部類可以方便地訪問外部類的私有變量,可以聲明為private從而實現(xiàn)對外完全隱藏。 在Java中,根據(jù)定義的位置和方式不同,主要有4種內(nèi)部類:
靜態(tài)內(nèi)部類:可以被外部使用(但要看訪問權(quán)限而定)成員內(nèi)部類:可以被外部使用(但要看訪問權(quán)限而定)方法內(nèi)部類:在一個方法內(nèi)限定和使用匿名內(nèi)部類:不能在外部使用
1.靜態(tài)內(nèi)部類:
class outer{
private static int shared=100;
public static class Staticinter{
public void innermethod(){
System.out.println(shared);
}
}
public void test(){
Staticinter si=new Staticinter();
si.innermethod();
}
}
靜態(tài)內(nèi)部類可以有:靜態(tài)變量、靜態(tài)方法、成員方法、成員變量、構(gòu)造方法等。它可以訪問外部類的靜態(tài)變量和方法,如innerMethod直接訪問shared變量。在類內(nèi)部,可以直接使用內(nèi)部靜態(tài)類,如test()方法所示。
public靜態(tài)內(nèi)部類可以被外部使用,只是需要通過“外部類.靜態(tài)內(nèi)部類”的方式使用:
public static void main(String[] args) {
outer.Staticinter O=new outer.Staticinter();
O.innermethod();
}
靜態(tài)內(nèi)部類的實現(xiàn): 代碼實際上會生成兩個類:一個是Outer,另一個是Outer$StaticInner 內(nèi)部類訪問了外部類的一個私有靜態(tài)變量shared,而我們知道私有變量是不能被類外部訪問的,Java的解決方法是:自動為Outer生成一個非私有訪問方法access$0,它返回這個私有靜態(tài)變量shared。
靜態(tài)內(nèi)部類的使用場景是很多的,如果它與外部類關(guān)系密切,且不依賴于外部類實例,則可以考慮定義為靜態(tài)內(nèi)部類。比如,一個類內(nèi)部,如果既要計算最大值,又要計算最小值,可以在一次遍歷中將最大值和最小值都計算出來,但怎么返回呢?可以定義一個類Pair,包括最大值和最小值,但Pair這個名字太普遍,而且它主要是類內(nèi)部使用的,就可以定義為一個靜態(tài)內(nèi)部類。
2.成員內(nèi)部類:
class outer{
private int shared=100;
public class inter{
public void innermethod(){
System.out.println(shared);
}
}
public void test(){
inter si=new inter();
si.innermethod();
}
}
如果內(nèi)部類與外部類關(guān)系密切,需要訪問外部類的實例變量或方法,則可以考慮定義為成員內(nèi)部類。 外部類的一些方法的返回值可能是某個接口,為了返回這個接口,外部類方法可能使用內(nèi)部類實現(xiàn)這個接口,這個內(nèi)部類可以被設(shè)為private,對外完全隱藏。
3.方法內(nèi)部類:
class outer{
private int shared=100;
public void test(){
final String str="hello";
class inner{
public void innermethod(){
System.out.println(shared);
}
}
inner in=new inner;
in.innermethod();
}
}
類Inner定義在外部類方法test中,方法內(nèi)部類只能在定義的方法內(nèi)被使用。如果方法是實例方法,則除了靜態(tài)變量和方法,內(nèi)部類還可以直接訪問外部類的實例變量和方法,如innerMethod直接訪問了外部私有實例變量a。如果方法是靜態(tài)方法,則方法內(nèi)部類只能訪問外部類的靜態(tài)變量和方法。方法內(nèi)部類還可以直接訪問方法的參數(shù)和方法中的局部變量,不過,這些變量必須被聲明為final,如innerMethod直接訪問了方法參數(shù)param和局部變量str。 4.匿名內(nèi)部類
柚子快報激活碼778899分享:java內(nèi)部類的本質(zhì)
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。