09 為什麼要有內部類?匿名內部類表現形式由來?

2021-07-16 09:53:15 字數 1979 閱讀 6439

為什麼要有內部類?

類內部裡的類,稱內部類內部類是為了實現多重繼承,通常是用於建立內部物件用的。

既然說是為了多重繼承,那就先看繼承:

package com.junc.test;

public class test1

}class father

class son extends father

通過繼承關係,我們可以由son來繼承father的money。

只有這一種方法麼?

還有一種方式,那就是內部類,所以說,內部類具備繼承特性。

看如下**:

package com.junc.test;

public class test2

}class father

}}

如果總是寫father.son這樣的**,實在是很麻煩,怎麼辦呢?

如果可以直接從father類呼叫就好了,如果能father.shopping()是不是會更好呢?

當然可以這樣子,看如下**:

package com.junc.test;

public class test2

}class father

}public void shopping()

}

father希望買東西,他有很多son,但他不想知道是哪個son去的,只要東西買回來的就可以了.

所以,我們可以將son匿名,並抽象化,既然匿名了,就取名為匿名內部類

package com.junc.test;

public class test2

}abstract class son

class father

};son.sonshopping();

}}

這就會奇怪了,son是abstract的,不能被例項化呀,也就是說,不能new son()。

那麼看仔細了哦,看仔細了,看仔細了。

注意:這裡寫的是new son() {}。

匿名內部類為什麼是這樣的表現形式呢?

當乙個新事物出現,需弄清楚三件事:

匿名內部類要滿足什麼樣的條件?

必須繼承乙個類或實現乙個介面

它是用來做什麼的?

直接使用此類物件,並實現其中的方法

什麼時候使用?

只需要呼叫一次物件的時候使用

表現形式:

而在實際開發中,我們希望的表現形式是直接看到**就可以知道我們想要做什麼,father要fathershopping就指派某個兒子去sonshopping()。用**表示為:father.fathershopping().sonshopping();

分析一下這行**,如果father類直接呼叫fathershopping()方法,代表著fathershopping()方法必然是靜態的,只有靜態的才可以直接由類呼叫。後面的sonshopping()方法必然是由乙個物件所呼叫的,那麼,我們就應該return返回乙個son物件,但我們不一定非要建立,正如前面所說,我們可以由匿名類直接跳過建立。

那麼,整體**又將如何實現呢?

package com.junc.test;

public class test2

}abstract class son

class father };}

}

是否發現,下面這行**:father.fathershopping().sonshopping();

有一種熟悉的味道:system.out.println();

為什麼要有匿名內部類?

匿名內部類實現 這顯然繼承了乙個抽象類,並且在主方法當中建立了抽象類的物件,本來我們是應該先繼承這個抽象類再開始建立物件的,否則物件是無法建立的,但是為了簡便,人們建立了了匿名內部類,允許我們在主方法當中進行抽象類的例項化,同時也可以進行物件的建立。這個程式就等同於如下的程式 以下 原文 出處 舉乙...

內部類,匿名內部類

內部類 概念 自己想到的 內部類是一種可以直接訪問外部類的一類事物 內部類訪問外部類中的成員,包括私有。之所以可以訪問外部類的成員,是因為內部類持有了外部類的乙個引用,格式為 outer.this.x 外部類訪問內部類成員,需要宣告內部類的物件。其他類訪問內部類方法 當內部類處在成員變數的位置時,就...

內部類 匿名內部類

把類定義在其他類的內部,這個類就叫內部類。內部類分為 成員內部類 區域性內部類。內部類訪問特點 內部類可以直接訪問外部類的成員,包括私有。外部類訪問內部類的成員,必須建立物件。區域性內部類是定義在乙個方法或者乙個作用域裡面的類。public class outer 在區域性位置建立內部類物件,調內部...