// 2004-9-18
內部類總結:
1內部類的嵌套可以理解成類的鏈關係,在構造一個內部類(非static)的執行個體的時候,會將直接外層類的執行個體
作為參數傳進建構函式,而外層類的執行個體也是用其外層類的執行個體構造,所以是一種鏈狀關係,內部的類可以使用所有
外層的類的執行個體,而外層的類不能使用內層的類, 應用a.this(最外層類執行個體) ,a.b.c.this(鏈中某個外層的執行個體)。
class TheOuter{
class kk {
class gg {
int tt = 100;
}
}
class aa {
class bb {
int jj = 10;
class cc {
{ int ff = TheOuter.aa.bb.this.jj;
// 無法直接存取到gg不在鏈關係內
System.out.println(ff);
}
}
}
}
}
2 建立一個內部類 new aa().new bb().new()cc 實際上是調用 外層類執行個體.new 本層建構函式()
如果內部類是static的不需要外層類的執行個體 多個static嵌套的內部類的執行個體 aa.bb.cc test = new aa.bb.cc();
3
class a0 {
class b0 {
}
}
class vvv{
class ff extends a0.b0 {// ff這裡不是內部類也行
ff(a0 kk){
kk.super();
}
}
}
繼承自內部類要調用父類的外層類的super()
4
class dd {
void print(){
System.out.println("dd.println is there");
}
class kk {
kk(int i){}
class cc {
void pp() {
System.out.println("****");
}
void ddpp() {
dd.this.print();
}
}
}
}
class aa {
public static void main (String agrs[]) {
dd.kk.cc test = new dd().new kk(10).new cc();
test.ddpp();
}
}
在類內部可以是使用外層類,但是如果產生一個執行個體的控制代碼就沒有提供訪問上層類的功能。
5 this 是指本類的執行個體
6 預設的new
class cc {
{
new test();
}
class kk {
{
System.out.println("there kk");
}
}
class test {
{
new kk();
}
class kk {
{
System.out.println("there test_kk");
}
}
}
}
可以直接使用new,new的範圍可以是直接外層.this.new 和this.new 但是如果內層與外層出現同名類以內部優先
7
//當有鏈關係的時候要注意類不要重名
class vv {
class bb {} //!
class kk {
//class vv{} 這樣就會出錯
class bb {} //!這樣就不會出錯
}
}
8
class a0 {
class b0 {
}
}
class vvv{
class ff extends a0.b0 {// 不是內部類也行
ff(a0 kk){
kk.super();
}
}
}
繼承自內部類要調用父類的外層類的super()
9 匿名內部類
interface oo {
//oo(int g) {}
int k = 10;
void pt();
}
class pp {
pp(int g) {
}
int get() {
return 100;
}
}
class me {
/*
interface oo {
void pt();
}
*/
class kk{
oo testmed() {
final int i = 10;
int g = 100;
return new oo() {
int kk;
{
// 使用外面的東西要聲名成final
// 繼承介面內部優先
// 匿名內部類沒有建構函式,只能使用塊,初始化
kk = i + k ;
}
public void pt() {
System.out.println(kk);
}
};
}
pp testmed0() {
return new pp(10){ // 繼承自類
public int get() {
return super.get() * 10;
}
};
}
}
}
匿名內部類可以繼承自介面也可以繼承自類,繼承自類的建構函式中 可以有參數。
10
class bf {
interface kk {}
class aa {
// 介面能嵌套在介面中(不受限制),或者嵌套在頂層,下面就不行
//interface gg {}
}
}