
首先我們來看一下內(nèi)部類的定義:
- 在一個(gè)類中定義另一個(gè)類,這樣定義的類稱為內(nèi)部類。【包含內(nèi)部類的類可以稱為內(nèi)部類的外部類】
- 如果想要通過一個(gè)類來使用另一個(gè)類,可以定義為內(nèi)部類?!颈热缣O果手機(jī)類,蘋果手機(jī)類中的黃金版的是特別定制的】
- 內(nèi)部類的外部類的成員變量在內(nèi)部類中仍然有效,內(nèi)部類中的方法也可以調(diào)用外部類中的方法?!静徽撌庆o態(tài)還是非靜態(tài)的,內(nèi)部類都可以直接調(diào)用外部
- 內(nèi)部類的類體中不可以聲明類變量和類方法
- 內(nèi)部類可以由外部類使用外部類中在函數(shù)中創(chuàng)建內(nèi)部類對象來使用,如果內(nèi)部類的權(quán)限是非私有,非靜態(tài)的,就可以在外部其他程序中被訪問到,就可以通過創(chuàng)建外部類對象完成;如果內(nèi)部類是靜態(tài)的,非私有的,靜態(tài)成員可以直接類名調(diào)用,非靜態(tài)成員通過創(chuàng)建外部類對象使用。
再來看一下匿名類的定義:
- 匿名類,就是沒有名稱的類,其名稱由Java編譯器給出,一般是形如:外部類名稱+$+匿名類順序,沒有名稱也就是其他地方就不能引用,不能實(shí)例化,只用一次,當(dāng)然也就不能有構(gòu)造器。
- 匿名類就是利用父類的構(gòu)造函數(shù)和自身類體構(gòu)造成一個(gè)類。
- 匿名類可以繼承父類的方法,也可以重寫父類的方法。
- 匿名類可以訪問外部類的成員變量和方法,匿名類的類體不可以聲明稱static成員變量和static方法。
- 匿名類由于是一個(gè)new的結(jié)果,所以其實(shí)可以賦值給一個(gè)父類對象。因此可以分為兩種匿名類,成員匿名類和局部匿名類(作為函數(shù)參數(shù))
上文都說匿名內(nèi)部類就是沒有名字的內(nèi)部類,哪個(gè)類沒有名字呢?好多文章都是直接告訴你什么什么是匿名內(nèi)部類,如下面:
我們一般會(huì)用來做參數(shù)的傳遞, 直接用接口來做
public interface D {
void run();
}
public class B{
@Override
public void run(D d) {
d.run();
}
}
看到這里是不是還是很疑惑,為什么接口也能new了呢?其實(shí)不然,在我們寫一個(gè)內(nèi)部類的時(shí)候,我們是省略了一些東西的
public class cryptonym {
public static void main(String[]args) {
B b=new B();
//調(diào)用時(shí)使用匿名類創(chuàng)建匿名對象
b.show(new D(
public void run() {
System.out.println("hello");){
}
});
}
}
這樣來看是不是就明了許多了?其實(shí)本意就是繼承了D這個(gè)接口之后,重寫了其中的方法。只不過我們再代碼中對這個(gè)類使用的次數(shù)不多。所以我們不需要再去寫一個(gè)繼承的類,來加大JVM的工作量,是不是很有意思。大家還有更多想知道的內(nèi)容歡迎在下方留言或者加入我們的群來跟我一起探討一下(850353792)