0901-090x 面向對象

內部類

講一個類定義在另一個類裏面,對裏面的那個類就成爲內部類。


class Outer
{
int x = 3;
class Inner
{
void function(){
System.out.println("inner"):
}
}

void method()
{
System.out.println(x);
Inner in = new Inner();
in.function();
}
}

class InnerClassDemo
{
public static void main(String[] args)
{
Outer out = new Outer;
out.method();
}
}

優勢:
如果inner在outer外,那麼inner訪問outer內的各種變量的時候,需要先創建一個outer。
如果inner直接在outer內部,根本就不需要outer,可以直接訪問一切需要的東西。

內部類的訪問規則:
1.內部類可以直接訪問外部類中的成員,包括私有。
2.外部類要訪問內部類,必須建立內部類對象。

因爲內部類屬於外部類,不同的外部類可能含有同名內部類,所以直接建立內部類時應該標註好內部外部。
class InnerClassDemo
{
public static void main(String[] args)
{
Outer.Inner a = new Outer().new Inner();
a.function();
}
}//面試

爲什麼內部類能直接訪問外部類的成員?
之所以可以直接訪問外部類中的成員,是因爲內部類中持有了一個外部類的引用。該引用寫法爲 外部類名.this
------------------------------------------------------------------------------------------------------------------

訪問格式:
1.當內部類定義在外部類的成員位置上,而且非私有,可以在外部其他類中,可以直接建立內部類對象。
格式:外部類名.內部類名 變量名 = 外部類對象.內部類對象;

Outer.Inner a = new Outer().new Inner();
2.什麼時候使用靜態內部類:不涉及到特有數據的時候(全是共享數據的時候)
當內部類在成員位置上,就可以被成員修飾符所修飾。

如:private:可以將內部類封裝於外部類之中。
再如:static:內部類就具備了靜態特性。

        當內部類被靜態修飾後,只能直接訪問外部類中的static成員。出現了訪問侷限。
在外部其它類中,如何直接訪問static內部類的非靜態成員?
new Outer.Inner().function();


在外部其他類中,如何直接訪問靜態內部類呢?
Outer.Inner.function();

若內部類有靜態成員,則內部類必須爲靜態。

當外部類中的靜態方法訪問內部類時,內部類也必須是靜態的。

class Outer
{
int x = 3;
static class Inner//靜態內部類
{
void function(){
System.out.println("inner"):
}
}

void method()
{
System.out.println(x);
Inner in = new Inner();
in.function();
}
}

class InnerClassDemo
{
public static void main(String[] args)
{
Outer out = new Outer;
out.method();
}
}

------------------------------------------------------------------------------------------------------------------
匿名內部類:就是內部類的簡寫格式。

簡寫一般都有前提,也有好處和弊端。

1.局部的內部類不能定義爲靜態。

class Outer
{
int x = 4;

void method()
{
class Inner{
void function{
 System.out.println(" aaa"+x);
}
}
}
new Inner().function();
}

class InnerClassDemo3
{
public static void main(String[] args)
{
new Outer().method();
}
}

編譯出錯:如果y不爲final 則無法訪問。

內部類定義在局部時:
1.不可以被成員修飾符修飾
2.可以直接訪問外部類中的成員,因爲還持有外部類中的引用。

不可以訪問它所在的局部中的變量。只能訪問被final修飾的局部變量。

匿名內部類定義前提:
1.匿名內部類其實就是內部類的簡寫格式。
2.定義匿名內部類的前提
內部類必須是繼承一個類或者實現接口。
=============================
1.匿名內部類其實就是內部類的簡寫格式。
2.定義匿名內部類的前提:
內部類必須繼承一個類或者實現接口。(和其他類有點關係)
3.匿名內部類的格式:new 父類或者接口(){
複寫或實現
}.調用需要的函數或者成員
4.其實匿名內部類就是一個匿名子類對象。一個胖對象。一個帶內容的對象。一個可以自己往裏填東西的對象。
5.匿名內部類中,定義方法最好不要超過三個。

匿名對象只能使用一次。如果想使用多個匿名對象的內部方法,那麼需要重新寫一次。
弊端:不能多次調用自己的成員函數。
不能進行類型轉化。
當內部成員非常多的時候,非常不利於代碼閱讀性,一般只寫兩個。

AbsDemo d = new AbsDemo()
{
void show()
{
System.out.println("wtf");
}

void abc()
{
System.out.println("haha")l
}
};


//和匿名內部類有關係的類

abstract class AbsDemo
{
abstract void show();
}
class Outer
{
int x = 4;

// class Inner  extends AbsDemo
// {
// void method()
// {
// System.out.println("method"+x);
// }
// }//與接口或外部類產生聯繫

public void function()
{
// new Inner.method();//匿名對象
new AbsDemo()
{
void show()
{
System.out.println("x=+x);
}//實現抽象方法
}
}//建立匿名內部類。爲什麼這麼做》?因爲要覆蓋抽象方法。這是AbsDemo的子類對象。這是上面備註
//部分的簡化寫法
}


public void function()
{
new AbsDemo()
{
void show()
{
System.out.println("x === "+x)
}
}.show();//匿名子類對象的成員函數調用
}
第一次看,誰看誰受不了。寫時間長了,就習慣了。可以簡化書寫,但是乍一看很費勁。(不是真正弊端)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章