Java 之內部類
阿新 • • 發佈:2018-12-26
定義
內部類是定義在一個類裡面的類,與之對應的包含內部類的類為外部類。
作用
- 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包的其他類訪問該類。
- 內部類的方法可以直接訪問外部類的所有資料,包括私有資料;外部類不可以直接訪問內部類成員和方法,需要先建立物件。
- 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便 。
public class HelloWorld{
public class InnerClass{
public void show(){
System.out.println("hello" )
}
}
public static void main(String[] args){
HelloWorld helloworld = new HelloWprld();
InnerClass ic = helloworld.new InnerClass();//訪問時要加一級
ic.show;
}
}
分類
成員內部類、靜態內部類、方法內部類、匿名內部類
成員內部類
- Inner 類定義在 HelloWorld 類的內部,相當於 HelloWorld 類的一個成員變數的位置,Inner 類可以使用任意訪問控制符,如:public,private 等。
- Inner 類中定的show()方法可以直接訪問外部類資料,不受訪問控制符的影響。
- 定義了成員內部類後,必須使用外部類的物件建立內部類的物件,不可以直接new一個內部類的物件,用static修飾的內部類除外,語法為:
內部類 物件名 = 外部類物件.new 內部類();
- 編譯時,產生兩個class檔案,外部類名 $ 內部類名 .class 為內部類檔案。
- 外部類不可以直接訪問內部類成員和方法,需要先建立物件。
- 如果外部類與內部類具有相同的成員變數或者方法時,內部類預設訪問自己的成員變數和方法,如果訪問外部類的成員變數,則為
外部類名.this.成員變數
靜態內部類
- 靜態內部類是有 static 修飾的內部類。
- 靜態內部類不能直接訪問外部類的非靜態成員,可以通過”new 外部類().成員“訪問。
- 如果外部類的靜態成員與內部類的成員名稱相同,則通過”類名.靜態成員“訪問外部類的靜態成員;若不相同,則可以直接通過”成員名“呼叫。
- 建立靜態內部類物件時,不需要外部類的物件
內部類 物件名 = new 內部類();
方法內部類
- 方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
- 方法內部類不能使用訪問控制符和static修飾。
匿名內部類
- 匿名內部類沒有類名,無 class 關鍵字,所以只能使用一次。
- 必須繼承一個父類或者實現一個介面,同時只能繼承或者實現一個類或者一個介面。
- 匿名內部類中不能定義建構函式。
- 匿名內部類不能存在任何靜態成員變數和方法
- 匿名內部類不能是抽象的,所以必須實現繼承的類或介面中的所有方法。
- 建立語法:
new 父類構造器(引數列表)| 介面(){
//匿名內部類的主體部分
}
如 Android 中對於一個 Button 進行偵聽
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Toast.makeText(FirstActivity.this, "aa", Toast.LENGTH_SHORT).show();
}
});