内部類的分類
内部類的概念
概念:在一個類的内部再定義一個類
public class Test01 {
class Inner{
}
}
特點:
- 編譯後可直接生成獨立的位元組碼檔案
- 内部類可以直接通路外部類的私有成員,不破壞封裝
- 可以為外部類提供必要的内部功能元件
public class Test01 {
private String name;
class Inner{
public void say(){
System.out.println(name);
}
}
}
成員内部類
- 在類的内部定義,與執行個體變量、執行個體方法同級别的類
- 外部類的一個執行個體部分,建立内部類對象時,必須依賴外部類對象
- 當外部類、内部類存在重名屬性時,會優先通路内部類屬性
- 成員内部類不能定義靜态成員(可以包含靜态常量 static final修飾)
public class Test01 {
private String name = "zheng";//外部屬性
private int age = 23;
class Inner{
private String name = "ben";
private char sex = '男';//内部屬性
private int tele = 12121;
public void say(){
System.out.println(Test01.this.name);//通路外部類屬性(重名)
System.out.println(name);
System.out.println(age);
System.out.println(sex);
System.out.println(tele);
}
}
public static void main(String[] args) {
//1.先建立外部類對象
Test01 test01 = new Test01();
//2.再建立内部類對象
Inner inner = test01.new Inner();
//或者:Inner inner = new Test01().new Inner();
inner.say();
}
}
結果:
靜态内部類
- 不依賴外部類對象,可直接建立或通過類名通路,可聲明靜态成員
- 隻能直接通路外部類的靜态成員(執行個體成員需要執行個體化外部類對象)
public class Test02 {
private String name = "zheng";
private int age = 23;
private static int add = 12;//外部類靜态屬性
static class Inner{
private char sex = '男';
private static int phone = 123456;//靜态屬性
public void say(){
Test02 test02 = new Test02();//建立外部類對象再調用屬性
System.out.println(test02.age);
System.out.println(test02.name);
System.out.println(sex);
System.out.println(Inner.phone);
System.out.println(add);//可以直接通路外部類靜态屬性
}
}
public static void main(String[] args) {
Test02.Inner inner= new Test02.Inner();
inner.say();
}
}
結果·:
局部内部類
- 定義在外部類的方法中,作用範圍和建立對象範圍僅限于目前方法
- 局部内部類通路外部類目前方法中的局部變量時,因無法保障變量的生命周期與自身相同,變量必須修飾為final
- 限制類的使用範圍
public class Test03 {
private String name = "zheng";
private int age = 23;
public void say(){
String address = "beijing";//局部變量
class Inner{//不能添加任何通路修飾符
private char sex = '男';
private int phone = 12346;
public void speak(){
System.out.println(Test03.this.name);
System.out.println(Test03.this.age);
System.out.println(sex);
System.out.println(phone);
//通路局部變量,jdk1.8後自動添加final
System.out.println(address);
}
}
//建立局部内部類對象
Inner inner = new Inner();
inner.speak();
}
public static void main(String[] args) {
Test03 test03 = new Test03();
test03.say();
}
}
結果:
匿名内部類
- 沒有類名的局部内部類
- 必須繼承一個父類或實作一個接口
- 定義類、實作類、建立對象的文法合并,隻能建立一個該類的對象。
- 優點:減少代碼量。
- 缺點:可讀性較差。
public class Test05 {
public static void main(String[] args) {
Usb usb = new Usb() {
@Override
public void service() {
System.out.println("滑鼠開始工作。。。");
}
};
usb.service();
}
}