文章目錄
- 一、内部類的多種形式
- 二、成員内部類
- 三、局部内部類
- 四、匿名内部類
- 五、内部類的調用方式總結
一、内部類的多種形式
- 靜态内部類,
static class StaticInnerClass{ };
- 成員内部類,
private class InstanceInnerClass{ };
- 局部内部類, 定義在方法或表達式内部
- 匿名内部類,
(new Thread() { }).start
package top.clearlight.book.efficientcode.insideclass;
public class InnerClassTest1 {
// 成員内部類
private class InstanceInnerClass {
}
// 靜态内部類
static class StaticInnerClass {
}
static int a = 1;
public static void main(String[] args) {
// 兩個匿名内部類
(new Thread() {}).start();
(new Thread() {}).start();
// 兩個方法内部類
class MethodClass {
}
class MethodClass2 {
}
}
}
源出處 : < Easy Coding >
二、成員内部類
将一個類直接定義在類的裡面, 作為類中成員, 與屬性或方法層次一緻
- 内部類既可以通路自身的資料域,也可以通路建立它的外圍類對象的資料域(包括私有的)
- 正常類的修飾符可以為
, 成員内部類可以使用不同的修飾符來修飾.public或default
- 内部類與外部類出現相同的變量名,想要引用外部類的域 ->
. (其中 外部類.this.外部成員
表示外圍類的引用OuterClass.this
- 内部類中聲明的所有靜态域必須用
修飾.final
- 内部類不能有static方法
- 源碼進行編譯後,産生一個位元組碼:
外部類$内部類.class
三、局部内部類
将一個類定義在方法/塊裡面,作為方法的内部結構,與臨時的局部變量一個層次
- 局部類不能用public或private通路符聲明.隻能用abstract或final修飾.
- 局部類可以對外部完全隐藏,隻有方法之外的代碼,都不能通路它. 是以需要在内部類裡面完成對象的定義和引用.
- 局部内部類通路外部類的成員使用 :
.外部類名.this.成員名
- 從内部類引用本地變量必須用
修飾或者實際上的最終變量. 内部類通路的局部變量必須事實上為final,一旦指派就絕對不會改變!final
public void testDemo() {
System.out.println("這是外部類中的方法");
int b = 1;
// 定義一個局部内部類
class LocalClass {
private String name;
int aa = 1;
public void test1() {
aa++;
// 報錯,因為調用的本地變量jdk8預設添加了final修飾符不可變
// b++;
}
public void test() {
System.out.println(InnerClassTest.this.name);
}
}
LocalClass lc = new LocalClass();
lc.test();
lc.test1();
}
public void testDemo() {
System.out.println("這是外部類中的方法");
int b = 1;
System.out.println(++b); // 此處做了自增,是以變量b不會預設添加final修飾符
// 定義一個局部内部類
class LocalClass {
private String name;
int aa = 1;
public void test1() {
aa++;
System.out.println(b); // 報錯, 因為局部内部類通路方法内的變量,需要使用final修飾.
}
}
LocalClass lc = new LocalClass();
lc.test1();
System.out.println(lc.aa);
}
四、匿名内部類
-
格式 : new 抽象類|接口(構造參數) {
實作的抽象方法 或 重寫方法;
};
- 如果抽象類被使用一次,可以使用匿名内部類建立該類執行個體實作抽象方法,但是多次使用,建議重新定義類!
- 使用匿名内部類時,我們必須是繼承一個類或者實作一個接口,但是兩者不可兼得,同時也隻能繼承一個類或者實作一個接口。
- 匿名内部類中是不能定義構造函數的。
- 匿名内部類中不能存在任何的靜态成員變量和靜态方法。
- 匿名内部類為局部内部類,是以局部内部類的所有限制同樣對匿名内部類生效。
- 匿名内部類不能是抽象的,它必須要實作繼承的類或者實作的接口的所有抽象方法。
3 - 7 引用優秀部落格第二篇