1.巢狀類和內部類
在類裡面定義另乙個類,這個類就叫巢狀類,巢狀類可以呼叫外部類的所有成員包含私有成員,但是外部類不能訪問巢狀類中的成員。
sttatic修飾的變數、方法或巢狀類在沒有建立物件的情況下可以通過類名直接訪問,當然通過物件也可以進行訪問,由於靜態成員不能訪問非靜態成員,而非靜態成員卻可以通過類名.直接訪問靜態成員。
所以靜態巢狀類就不能訪問外部類的非靜態成員了,所以很少使用靜態巢狀類。
而非靜態巢狀類就被廣泛使用,俗稱內部類。只能在外部類內建立內部類的例項物件,限制了內部類的作用域,在內部類的外部類之外的範圍建立該內部類實力會產生錯誤報nosuchclas***ception。
2.內部類分類
2.1靜態內部類
加了static的內部類,就是巢狀類,有兩個特點:
①因為加了static所以可以通過類名直接訪問,所以在建立靜態內部類物件時,不需要先建立外部類物件了。
②因為static修飾的靜態類成員不能訪問非靜態成員,所以靜態內部類物件不能訪問外部類的非靜態成員。
③因為區域性變數不能加static修飾詞,所以不能在外部類的方法或類似for迴圈體的**塊中定義靜態內部類。
2.2私有內部類
加了private修飾的內部類,就是私有內部類,相當於外部類的乙個私有成員。
特點①因為區域性變數不能加private,所以不能在方法或者其他類似for迴圈體的**塊中定義私有內部類了。
2.3區域性內部類
我們也可以在任何**塊的作用域內定義非靜態的內部類把它看做乙個區域性變數,比如在方法或者for迴圈踢內定義巢狀類,稱為區域性內部類。
示例**:
class outer
}inner inner = new inner();
inner.display();
} } }
public class innerclassdemo
}
執行結果:
a=6
a=6a=6
2.4匿名內部類
最常用的一種內部類,不需要類名,用來重寫父類方法,常用於介面或者抽象類的例項化實現,new介面或者抽象類的匿名子類物件
weapon w = new weapon() ;
(變數為父類型別,new的是子類物件,但由於子類沒有類名,所以寫成父類物件格式,()為父類構造器,後面接,最後要記得加「;」)
l 大括號是weapon的匿名子類,其內可以重寫父類weapon的方法,並定義自己的屬性
l new 新建匿名子類的物件
l 小括號 super()、super(引數),呼叫父類構造器
l 變數型別必須用父型別
示例**:
//匿名內部類
public class anonymousclass
@override
public int test2(int a)
};humen.test1();
humen.test2(0);
pig pig = new pig(10)};
pig.prodemo();
pig.processdemo();
system.out.println("定義匿名內部類的()是父類構造器,賦值i="+pig.i);}}
inte***ce humen
abstract class pig
void prodemo()
abstract void processdemo();
}
執行結果:
重寫父類介面中的抽象方法
介面中變數預設都是公共的靜態常量
抽象方法有建構函式,但是介面沒有建構函式
這是個抽象類
重寫父類抽象類中的抽象方法
定義匿名內部類的()是父類構造器,賦值i=10
內部類總結
1內部類的巢狀可以理解成類的鏈關係,在構造乙個內部類 非static 的例項的時候,會將直接外層類的例項 作為引數傳進建構函式,而外層類的例項也是用其外層類的例項構造,所以是一種鏈狀關係,內部的類可以使用所有 外層的類的例項,而外層的類不能使用內層的類,應用a.this 最外層類例項 a.b.c.t...
內部類總結
內部類不是很好理解,但說白了其實也就是乙個類中還包含著另外乙個類 如同乙個人是由大腦 肢體 器官等身體結果組成,而內部類相當於其中的某個器官之一,例如心臟 它也有自己的屬性和行為 血液 跳動 顯然,此處不能單方面用屬性或者方法表示乙個心臟,而需要乙個類 而心臟又在人體當中,正如同是內部類在外部內當中...
內部類總結
內部類不是很好理解,但說白了其實也就是乙個類中還包含著另外乙個類 如同乙個人是由大腦 肢體 器官等身體結果組成,而內部類相當於其中的某個器官之一,例如心臟 它也有自己的屬性和行為 血液 跳動 顯然,此處不能單方面用屬性或者方法表示乙個心臟,而需要乙個類 而心臟又在人體當中,正如同是內部類在外部內當中...