標籤:tom 允許 成員變數 大括弧 直接 獨立 類的屬性 就會 優點
為什麼要使用內部類呢?
1.內部類提供了更好的封裝,只有外部類能訪問內部類
2.內部類可以獨立繼承一個介面,不受外部類是否繼承介面影響
3.內部類中的屬性和方法即使是外部類也不能直接存取,相反內部類可以直接存取外部類的屬性和方法,即使private
4.利於回呼函數的編寫
在Java中內部類主要分為成員內部類、方法內部類、匿名內部類、靜態內部類。今天先來瞭解一下靜態內部類和成員內部類。
靜態內部類:
關鍵字static可以修飾成員變數、方法、代碼塊,其實它還可以修飾內部類,使用static修飾的內部類我們稱之為靜態內部類。靜態內部類與非靜態內部類之間存在一個最大的區別,我們知道非靜態內部類在編譯完成之後會隱含地儲存著一個引用,該引用是指向建立它的外圍內,但是靜態內部類卻沒有。沒有這個引用就意味著:
靜態內部類的建立是不需要依賴於外圍類,可以直接建立
靜態內部類不可以使用任何外圍類的非static成員變數和方法,而內部類則都可以
結合下面的代碼來加深理解。
public class OuterClass1{
//靜態變數
private static String s1="A";
//成員變數
private String s2="B";
//靜態方法
private static void m1(){
System.out.println("static‘s method m1 is excuted!");
}
//成員方法
private void m2(){
System.out.println("static‘s method m2 is excuted!");
}
/* public static void main(String args[]){
System.out.println("sd");
} */
//靜態內部類,可以用存取控制許可權修飾,public,protected,private,預設
static class InerClass{
//靜態內部類中的靜態方法
public static void m3(){
System.out.println(s1); //內部類方法訪問外部類private靜態變數
//System.out.println(s2); //內部類方法訪問外部類private成員變數,出錯,無法從靜態上下文中引用非靜態變數 s2
m1(); //內部類訪問外部類的靜態方法
//m2(); //出錯,無法從靜態上下文中引用非靜態方法 m2()
}
//靜態內部類中的成員方法
public void m4(){
}
}
public static void main(String args[]){
//外部類方法訪問靜態內部類的靜態方法,靜態方法的訪問,直接類名.方法名訪問
OuterClass1.InerClass.m3();
//外部類方法訪問靜態內部類的成員方法,需要建立對象
InerClass t=new OuterClass1.InerClass();
t.m4();
}
}
//輸出:A
//static‘s method m1 is excuted!
從上面代碼可以看出:
1.靜態內部類可以等同於靜態變數。
2.靜態內部類可以直接存取外部類的待用資料,包括靜態變數和靜態方法,但無法訪問成員資料(成員變數和成員方法)。
成員內部類:
成員內部類也是最普通的內部類,它是外部類的一個成員,所以他是可以無限制的訪問外圍類的所有成員屬性和方法,儘管是private的,但是外圍類要訪問內部類的成員屬性和方法則需要通過內部類執行個體來訪問。
在成員內部類中要注意兩點:
成員內部類中不能存在任何static的變數和方法
成員內部類是依附於外圍類的,所以只有先建立了外圍類才能夠建立內部類
public class OuterClass2{
//靜態變數
private static String s1="A";
//成員變數
private String s2="B";
//靜態方法
private static void m1(){
System.out.println("static‘s method m1 is excuted!");
}
//成員方法
private void m2(){
System.out.println("static‘s method m2 is excuted!");
}
/* public static void main(String args[]){
System.out.println("sd");
} */
//成員內部類,可以用存取控制許可權修飾,public,protected,private,預設
class InerClass{
/* public static void m3(){ //成員內部類中不允許有靜態聲明
System.out.println(s1);
m1();
} */
//成員內部類中的成員方法
public void m4(){
System.out.println("sdfsf");
}
}
public static void main(String[] args){
//訪問成員內部類中的成員方法,m4()方法。m4()方法為成員方法,所以InerClass先建立對象。InerClass為成員,所以先建立出來OuterClass的對象。
//先建立外部類對象
OuterClass2 t2=new OuterClass2();
InerClass inner=t2.new InerClass();
inner.m4();
}
}
需要記住:
1.成員內部類可以等同看做成員變數
2.成員內部類不能有靜態聲明
3.成員內部類可以訪問外部類的所有資料
局部內部類:
局部內部類定義在外部類的方法中,和成員內部類基本一致,只是它們的範圍不同,局部內部類只能在該方法中被使用,出了該方法就會失效。 對於這個類的使用主要是應用與解決比較複雜的問題,想建立一個類來輔助我們的解決方案,到那時又不希望這個類是公用可用的,所以就產生了局部內部類。
public class OuterClass3{
//方法
public void m1(){
final int i=10;
//局部內部類,局部內部類不能用存取權限修飾符修飾
class InnerClass{
//public static void m1(){} 內部類不能有靜態聲明
//成員方法
public void m2(){
System.out.println(i);
}
}
InnerClass inner=new InnerClass();
inner.m2();
}
//想要在外部類中訪問m2()方法,m2()方法在局部內部類中,不能直接存取,作用範圍不同,出了大括弧就不認識了
public static void main(String[] args){
OuterClass3 t3=new OuterClass3();
t3.m1();
}
}
關於局部內部類,需要記住以下幾點:
1.局部內部類等同於局部變數
2.局部內部類不能用存取控制許可權修飾符修飾
3.局部內部類在訪問局部變數的時候,局部變數必須使用final修飾。
匿名內部類:
匿名內部類其實就是一個沒有名字的方法內部類,所以它符合方法內部類的所有約束,除此之外,還有一些地方需要注意:
匿名內部類是沒有存取修飾詞的。
匿名內部類必須繼承一個抽象類別或者實現一個介面
匿名內部類中不能存在任何靜態成員或方法
匿名內部類是沒有構造方法的,因為它沒有類名。
public class Testa{
public static void t(CustomerService cs){ //t方法調用介面
cs.logout();
}
//程式入口
public static void main(String[] args){
//調用t方法
// t(new CustomerService()); 出錯,介面無法建立對象
t(new CustomerService(){ //new CustomerService(){}整個就是匿名內部類
public void logout(){
System.out.println("系統已經安全退出");
}
});
}
}
匿名內部類有它的優點,那就是可以少定義一個類,它的缺點就是無法重複利用。
搜尋公眾號“程式員考拉”,歡迎關注!
Java 內部類