內部類
- 一個類定義在另外一個類裡面或者一個方法裡面,這樣的類叫做內部類
成員內部類
package test.InnerClass;
class CSer {
String weapon;
private int hp;
static int money = 800;
public CSer() {
// 外部類想要訪問內部類的成員,必須先建立一個成員內部類的物件,再透過這個物件來訪問
new Weapon().print();
}
class Weapon {
int damage = 80;
public void print() {
// 內部類可以隨心所欲地訪問外部類的成員
System.out.println(hp);
System.out.println(money);
}
}
}
public class Test {
public static void main(String[] args) {
// 在靜態方法中訪問成員內部類的時候,就必須先得建立一個外部類的物件,因為內部類是依附於外部類的
CSer cSer = new CSer();
CSer.Weapon weapon = cSer.new Weapon();
weapon.print();
}
}
區域性內部類
class Weapon {
public Weapon print() {
// 區域性內部類是定義在一個方法或者一個作用域裡面的類,所以區域性內部類的生命週期僅限於作用域內。
class AWP extends Weapon {
private int damage = 80;
}
return new AWP();
}
}
- 區域性內部類就好像一個區域性變數一樣,它是不能被許可權修飾符修飾的,比如說 public、protected、private 和 static 等。
匿名內部類
public class ThreadDemo {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
t.start();
}
}
- 匿名內部類的作用主要是用來繼承其他類或者實現介面,並不需要增加額外的方法,方便對繼承的方法進行實現或者重寫。
- 匿名內部類是唯一一種沒有構造方法的類。
靜態內部類
class CSer {
String weapon;
private int hp;
static int money = 800;
public CSer() {
new Weapon().print();
}
// 靜態內部類和成員內部類類似,只是多了一個static關鍵字。
static class Weapon {
int damage = 80;
public void print() {
// 由於static關鍵字的存在,靜態內部類是不允許訪問外部類中非static的變數和方法的
System.out.println(money);
}
}
}
內部類特性
- 1、內部類可以使用多個例項,每個例項都有自己的狀態資訊,並且與其他外圍物件的資訊相互獨立。
- 2、在單個外部類中,可以讓多個內部類以不同的方式實現同一個介面,或者繼承同一個類。
- 3、建立內部類物件的時刻並不依賴於外部類物件的建立。
- 4、內部類並沒有令人迷惑的“is-a”關係,他就是一個獨立的實體。
- 5、內部類提供了更好的封裝,除了該外圍類,其他類都不能訪問。