/*
匿名内部類:就是内部類的簡寫格式。
必須前提:内部類必須繼承或者實作一個類或者接口。
匿名内部類其實就是一個匿名 子類對象。
格式:new 父類對象 or 接口(){
子類内容;(覆寫父類的, 而且可以增加自己的方法)
}//相當于将 繼承父類 和 new 的過程 寫到了一起有某有!很友善有某有!
*/
class Outer{
int num;
public Outer(){
num = 5;
}
class Inner{
int num;
public Inner(){
num = 10;
}
public void show(){//也就是調用該方法會有兩個this指針入棧,why?很簡單,因為内部類要通路外部類的資料啊!
int num = 11;
System.out.println("Inner part num " + num);//列印内部類中方法中的局部num變量
System.out.println("Inner num " + this.num);//列印内部類中num成員變量
//System.out.println("Inner num " + Inner.this.num);//列印内部類中num成員變量
System.out.println("Outer num " + Outer.this.num);//列印外部類中num成員變量
}
}
public void methods(){
final int num = 55;//這個變量為什麼一定要用final修飾呢?
//因為如果不用final修飾,num就是一個局部變量,當這個函數結束之後就會消失!
//而我們是在局部内部類的中通路這個num,這個類産生的對象是在堆上的,函數結束
//對象也不會消失,那麼這個對象在以後可能會多次通路這個num變量,這樣就出錯了!
//如果是final, num 就是 55這一個值,不會變!
class InnerTwo{
void show(){
System.out.println("part Inner final num = " + num);
}
}
InnerTwo in = new InnerTwo();
in.show();
}
public void way(){
System.out.println("******************************************");
//普通内部類:
new Inner().show();//匿名對象
new Inner(){ // 匿名内部類
public void show(){
System.out.println("内部類的匿名類!");
}
}.show();
//靜态内部類:
new InnerOne().way();
new InnerOne(){
public void way(){
System.out.println("靜态内部類的匿名類!");
}
}.way();
//外部類:
new Outer().show();
new Outer(){
public void show(){
System.out.println("外部類的匿名類!");
}
}.show();
}
static class InnerOne{
public static int num = 100;
public void way(){
System.out.println("靜态内部類中的方法!");
}
public static void show(){
System.out.println("static InnerOne num " + num);
}
}
public void show(){
System.out.println("Outer num " + num);
}
}
public class PC{
public static void main(String[] args){
Outer out = new Outer();
out.show();
Outer.Inner in = out.new Inner();
in.show();
// out.InnerOne.show();//類的所屬是類, 類是加載到方法區的,當然對象執行個體中不存在類;
Outer.InnerOne.show();
//匿名類和匿名對象的測試:
out.way();
}
}