轉(zhuǎn)載自:http://www.cnblogs.com/chenssy/p/3388487.html
內(nèi)部類:在一個(gè)類的內(nèi)部定義了一個(gè)類
內(nèi)部類的作用:使用內(nèi)部類的原因是:每個(gè)內(nèi)部類都能獨(dú)立地繼承一個(gè)(接口)實(shí)現(xiàn),所以無(wú)論是外圍類是否已經(jīng)繼承了某個(gè)(接口)實(shí)現(xiàn)骑素,對(duì)于內(nèi)部類都沒(méi)有影響。
使用內(nèi)部類帶來(lái)的好處:
- 內(nèi)部類可以用多個(gè)實(shí)例膏燕,每個(gè)實(shí)例都有自己的狀態(tài)信息,并且與其他外圍對(duì)象的信息相互獨(dú)立悟民。
- 在單個(gè)外圍類中坝辫,可以讓多個(gè)內(nèi)部類實(shí)現(xiàn)同一接口或者繼承某一個(gè)類(包括抽象類),具體的實(shí)現(xiàn)可以不同射亏。
- 創(chuàng)建內(nèi)部類對(duì)象的時(shí)刻并不依賴與外圍類對(duì)象的創(chuàng)建近忙。
- 內(nèi)部類并沒(méi)有令人迷惑的“is - a ”關(guān)系,它是獨(dú)立的
- 內(nèi)部類提供了更好的封裝鸦泳,除了該外圍類银锻,其他類都不能訪問(wèn)。
內(nèi)部類用法
成員內(nèi)部類
成員內(nèi)部類也是最普通的內(nèi)部類做鹰,它是外圍類的一個(gè)成員,所以他是可以無(wú)限制的訪問(wèn)外圍類的所有成員變量和方法鼎姐,包括private修飾的钾麸。外圍類要訪問(wèn)內(nèi)部列的成員屬性和方法時(shí)更振,必須通過(guò)內(nèi)部類的實(shí)例倆訪問(wèn)。
在成員內(nèi)部類中:
- 成員內(nèi)部類中不能存在private
- 成員內(nèi)部類只有在創(chuàng)建了外圍類才能創(chuàng)建內(nèi)部類
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.getInnerClass();
OuterClass 屬于外圍類饭尝,InnerClass屬于OuterClass的內(nèi)部類肯腕。 - 推薦使用getxxx()來(lái)獲取成員內(nèi)部類,尤其是該內(nèi)部類的構(gòu)造函數(shù)無(wú)參數(shù)時(shí)钥平。
局部?jī)?nèi)部類
有這樣一種內(nèi)部類实撒,它是嵌套在方法和作用域內(nèi)的,對(duì)于這個(gè)類的使用主要是應(yīng)用與解決比較復(fù)雜的問(wèn)題涉瘾,想創(chuàng)建一個(gè)類來(lái)輔助我們的解決方案知态,到那時(shí)又不希望這個(gè)類是公共可用的,所以就產(chǎn)生了局部?jī)?nèi)部類立叛,局部?jī)?nèi)部類和成員內(nèi)部類一樣被編譯负敏,只是它的作用域發(fā)生了改變,它只能在該方法和屬性中被使用秘蛇,出了該方法和屬性就會(huì)失效其做。
-
定義在方法中
public class Parcel5 { public Destionation destionation(String str){ class PDestionation implements Destionation{ private String label; private PDestionation(String whereTo){ label = whereTo; } public String readLabel(){ return label; } } return new PDestionation(str); } public static void main(String[] args) { Parcel5 parcel5 = new Parcel5(); Destionation d = parcel5.destionation("chenssy"); } }
定義在作用域中
public class Parcel6 {
private void internalTracking(boolean b){
if(b){
class TrackingSlip{
private String id;
TrackingSlip(String s) {
id = s;
}
String getSlip(){
return id;
}
}
TrackingSlip ts = new TrackingSlip("chenssy");
String string = ts.getSlip();
}
}
public void track(){
internalTracking(true);
}
public static void main(String[] args) {
Parcel6 parcel6 = new Parcel6();
parcel6.track();
}
}
匿名內(nèi)部類
public class OuterClass {
public InnerClass getInnerClass(final int num,String str2){
return new InnerClass(){
int number = num + 3;
public int getNumber(){
return number;
}
}; /* 注意:分號(hào)不能省 */
}
public static void main(String[] args) {
OuterClass out = new OuterClass();
InnerClass inner = out.getInnerClass(2, "chenssy");
System.out.println(inner.getNumber());
}
}
interface InnerClass {
int getNumber();
}
注意:
- 匿名內(nèi)部類是沒(méi)有訪問(wèn)修飾符的
- new 匿名內(nèi)部類,這個(gè)類首先要存在赁还。
- 注意getInnerClass()方法的形參妖泄,第一個(gè)形參是用final修飾的,而第二個(gè)卻沒(méi)有艘策。同時(shí)我們也發(fā)現(xiàn)第二個(gè)形參在匿名內(nèi)部類中沒(méi)有使用過(guò)浮庐,所以當(dāng)所在方法的形參需要被匿名內(nèi)部類使用,那么這個(gè)形參就必須為final柬焕。
- 匿名內(nèi)部類是沒(méi)有構(gòu)造方法的审残。因?yàn)樗B名字都沒(méi)有何來(lái)構(gòu)造方法。
- 匿名內(nèi)部類必須實(shí)現(xiàn)一個(gè)父類或者一個(gè)接口斑举。
靜態(tài)內(nèi)部類
使用static修飾的內(nèi)部類我們稱之為靜態(tài)內(nèi)部類搅轿。
靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類之間存在一個(gè)最大的區(qū)別,我們知道非靜態(tài)內(nèi)部類在編譯完成之后會(huì)隱含地保存著一個(gè)引用富玷,該引用是指向創(chuàng)建它的外圍內(nèi)璧坟,但是靜態(tài)內(nèi)部類卻沒(méi)有。沒(méi)有這個(gè)引用就意味著:
- 它的創(chuàng)建是不需要依賴于外圍類的赎懦。
- 它不能使用任何外圍類的非static成員變量和方法雀鹃。