Java基礎——內部類
阿新 • • 發佈:2020-07-31
內部類
我們學習類與物件後,知道了類的定義和使用
也知道抽象類以及包裝器類的用法
類中除了定義成員屬性和成員方法外
還能新增內部類
概述
內部類(內建類)(巢狀類):定義在另一個類中的類。
特點
- 內部類是編譯時的語法,編譯後生成兩個獨立的類。
- 內部類可以訪問外部類的任何成員。
- 外部類不能直接訪問內部類的成員。
- 內部類可以為靜態,
private
、protected
修飾,外部類只能用public
、default
預設的包訪問。 - 用內部類定義在外部類不可訪問的屬性,實現必外部類的
private
更小的訪問許可權。
類別
- 成員內部類
- 區域性內部類
- 匿名內部類
- 靜態內部類
成員內部類
作為外部類的成員存在,與外部類的屬性、方法並列。
class OutClass{
//成員屬性
private int i;
//成員方法
void print(){
System.out.println("外部類");
}
//內部類
class Inner{
}
}
建立物件
- 在外部類的內部。
Inner i = new Inner();
- 在外部類的外部。
- 建立一個外部類物件
- 生成一個內部類物件
訪問
- 在內部類中訪問內部類變數。
內部類.this.屬性;
- 訪問外部類成員
外部類名.this.屬性
- 在外部類的外部訪問內部類
內部類物件.物件名
區域性內部類
在方法中定義的內部類為區域性內部類。
區域性內部類不能加修飾符private
、public
、protected
class OutClass{ //外包方法 public void print(){ System.out.println("外部類方法"); //區域性內部類 class Inner{ //區域性內部類方法 public void method(){ } } //建立區域性內部類物件 Inner in = new Inner(); //呼叫區域性內部類方法 in.method(); } }
特點
- 區域性內部類可以訪問外包方法之外的外部類的所以成員
- 區域性內部類可以該訪問外包方法的引數
- 區域性內部類只能訪問區域性中被
final
修飾的區域性變數 - 區域性內部類不能宣告為介面
使用
使用區域性內部類時,需要
- 生成外部類物件
- 通過外部類物件呼叫外包方法;在方法中才能呼叫區域性內部類
匿名內部類
匿名內部類是區域性內部類的使用擴充套件
只建立類的一個物件,不用對內部類命名。
interface anonymous{
void print();
}
class{
public void print(){
System.out.println("外部類方法");
//匿名內部類
anonymous an = new anonymous(){
//區域性內部類方法
public void method(){
}
};
an.method();
}
}
特點
- 匿名類沒有類名,必須繼承一個類或實現一個介面。不能有顯式的
extends
、implements
- 匿名類不能有構造方法,沒有匿名。可通過
new 父類名();
建立物件 - 匿名類的建立和定義同時進行
- 匿名類只能一次性的建立物件
- 匿名類可以在方法體中,可以在引數列表中
- 匿名內部類不能是抽象類。
- 匿名內部類必須實現它的抽象父類或者接口裡的所有抽象方法
- 匿名內部類一定是在new的後面,其隱含實現一個介面或一個類,沒有類名
靜態內部類
靜態內部類定義在類中,在方法之外。static
修飾
class OutClass{
public void print(){
System.out.println("外部類方法");
}
//靜態內部類
protected static class Inner{
}
}
使用
靜態內部類的物件可以直接生成。
public class Demo{
public static void main(String args[]){
OutClass.Inner inner = new OutClass.Inner();
}
}
特點
- 靜態內部類直接訪問外部類的靜態成員,不能直接訪問外部類的非靜態程式
- 靜態內部類可定義靜態成員,其他內部類不行
- 內部類有靜態成員,其內部類也必須為靜態。
部落格相關java專案:檢視Github專案
對應github專案:Inner
匯入專案的方法: Java基礎——Java如何匯入本地專案