代碼1這段代碼中有一個new的操作,而且是在方法參數(shù)中進行的,這給了我一個好奇的點。此時首先想到的是C#中的匿名類,于是網(wǎng)上找了找資料,確實是類似的語法特性。繼續(xù)看代碼就發(fā)現(xiàn)一個問題:ConfigurableServerChannel是一個接口,而且Initializer是ConfigurableServerChannel中的一個內(nèi)部嵌套接口。
代碼2這就有另一個問題,接口怎么就可以實例化呢?還是代碼1中的代碼,發(fā)現(xiàn)其實例化時是直接包含了一段實現(xiàn),并且實現(xiàn)了configureChannel方法。這就說明直接實現(xiàn)了一個類來繼承Initializer接口。這里匿名類就顯身了。也就是說代碼看起來是在實例化一個接口,實際上是通過匿名類的機制實現(xiàn)了一個類,并且動態(tài)創(chuàng)建這個匿名類的實例。這樣寫的好處是很明顯的,使用接口來約定,在具體使用時再實際使用業(yè)務代碼。這樣做代碼也精簡了許多,不需要創(chuàng)建一堆的java代碼單元。但如果類需要具名且重復使用的話那么就不太適合使用這種做法,否則會產(chǎn)生許多重復的代碼。在看代碼的時候?qū)W到另一個知識,就是原來接口里也可以有實現(xiàn),看代碼2中的Persistent靜態(tài)類是直接繼承實現(xiàn)了Initializer接口。這種寫法第一次見,想了半天也沒太明白怎么回事。于是寫個例子自己跑跑看:
代碼3上面的代碼運行的結(jié)果如下:I am object instance: AI am StaticClass: B我了個去,好吧,有點不淡定了。原來靜態(tài)類也可以實例化!!!!!!為了確認此問題我把StaticClass的的static給去掉,運行的結(jié)果是一樣的,那么我就不知道這個static有什么具體作用呢?這個有時間再研究研究吧。新聞熱點
疑難解答