匿名類,匿名內(nèi)部類

很多在學(xué)習(xí)JAVA基礎(chǔ)的時(shí)候總會(huì)遇到一個(gè)問題,這個(gè)匿名內(nèi)部類為什么只能用一次呢?他到底是什么玩意兒?為什么這里會(huì)new一個(gè)接口???這什么呀這是!

首先我們來看一下內(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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容