天天看點

看我72變-多變的内部類 | 帶你學《Java面向對象程式設計》之八十五

上一篇:内部類的“獨立”-static内部類 | 帶你學《Java面向對象程式設計》之八十四

【本節目标】

通過閱讀本節内容,你将了解到内部類的其他定義方式,并掌握内部類的定義方法,學會在複雜的開發過程中以正确的方式定義内部類。

方法中定義内部類

内部類可以在任意的結構中進行定義,這就包括了:類中、方法中、代碼塊中,但是從實際的開發來講在方法中定義内部類的形式較多。

範例:觀察在方法中定義的内部類

class Outer {
    private String msg = "www.mldn.cn" ;
    public void fun(long time) {
        class Inner {          //内部類
            public void print() {
                System.out.println(Outer.this.msg) ;
                System.out.println(time) ;
            }
        }
        new Inner().print() ;        //方法中直接執行個體化内部類對象
    }
}
public class JavaDemo{
    public static void main(String args[])  {
        new Outer().fun(2390239023L) ;
    }
}           

執行結果:

www.mldn.cn

2390239023

此時在fun()方法内部提供有Inner内部類的定義,并且可以發現内部類可以直接通路外部類中的私有屬性,也可以直接通路方法中的參數,但是對于方法中的參數直接通路是從JDK1.8開始支援的。而在JDK1.8之前,如果方法中定義的内部類要想通路方法中的參數,則參數前必須追加final。

範例:在JDK1.8以前的程式結構

class Outer {
    private String msg = "www.mldn.cn" ;
    public void fun(final long time) {
        final String info = "我很好" ;
        class Inner {          //内部類
            public void print() {
                System.out.println(Outer.this.msg) ;
                System.out.println(time) ;
                System.out.println(info) ;
            }
        }
        new Inner().print() ;        //方法中直接執行個體化内部類對象
    }
}           

我很好

之是以取消這樣的限制,主要是為了其擴充的函數式程式設計準備的功能。

匿名内部類

匿名内部類是一種簡化的内部類的處理形式,其主要是在抽象類和接口的子類上使用的。

範例:觀察一個基本的程式結構

interface IMessage {
    public void send(String str) ;
}
class MessageImpl implements IMessage {
    public void send(String str) {
        System.out.println(str) ;     //www.mldn.cn
    }
}
public class JavaDemo{
    public static void main(String args[])  {
        IMessage msg = new MessageImpl() ;
        msg.send("www.mldn.cn") ;
    }
}             

如果現在IMessage接口中的MessageImpl子類隻使用唯一的一次,那麼是否還有必要将其定義為單獨的類,那麼在這樣的要求下就發現這個時候定義的子類是有些多餘了,是以就可以利用匿名内部類的形式來解決此問題。

範例:使用匿名内部類

interface IMessage {
    public void send(String str) ;
}
public class JavaDemo{
    public static void main(String args[])  {
        IMessage msg = new IMessage() {        //匿名内部類
              public void send(String str) {
                  System.out.println(str) ;   //www.mldn.cn
              }
        } ;
        msg.send("www.mldn.cn") ;
    }
}           

有些時候為了更加友善的展現出匿名内部類的使用,往往可以利用靜态方法做一個内部的匿名内部類的實作。

範例:在接口中直接定義匿名内部類

interface IMessage {
    public void send(String str) ;
    public static IMessage getInstance() {
         return new IMessage() {
              public void send(String str) {
                  System.out.println(str) ;      //www.mldn.cn
              }
         } ;
     }
}
public class JavaDemo{
     public static void main(String args[])  {
         IMessage.getInstance.send("www.mldn.cn") ;
     }
}           

與内部類相比,匿名内部類隻是一個沒有名字的隻能夠使用一次的,并且結構固定的一個子類操作。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:教你利用Lambda将代碼化繁為簡 | 帶你學《Java面向對象程式設計》之八十六 更多Java面向對象程式設計文章檢視此處