1. 程式人生 > >對 Java 的匿名內部類理解

對 Java 的匿名內部類理解

對 Java 的匿名內部類理解

JAVA面向物件三大特性:封裝、繼承、多型。

多型:可以理解為大千世界中的物件在不同的環境下可能會有多種形態。

Java中多型存在的前提:必須存在繼承、父類的引用指向子類的物件。

匿名內部類:就是沒有名字的內部類,所以匿名內部類只能使用一次。

通常使用匿名內部類來簡化程式碼編寫,但使用匿名內部類有個前提條件:必須繼承一個父類或實現一個介面。

案例1:不使用匿名內部類來實現抽象方法
    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 10:04
     * @ Description: 不使用匿名內部類來實現抽象方法
     */
    public class Demo {
        public static void main(String[] args) {
            Person p=new Child();
            p.eat();
        }
    }
    
    abstract class Person{
        public abstract void eat();
    }
    
    class Child extends Person{
        @Override
        public void eat() {
            System.out.println("吃東西");
        }
    }

執行結果:吃東西。

可以看到,我們用Child繼承了Person類,然後實現了Child的一個例項,將其向上轉型為Person類的引用,而Child類就是我們在匿名內部類中隱藏的類;如果此處的Child類只使用一次,而將其編寫為獨立的一個類豈不是很麻煩?

當然我們可以使用匿名內部類解決。

案例2:匿名內部類的基本實現

    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 10:54
     * @ Description: 匿名內部類的基本實現
     */
    public class Demo2 {
        public static void main(String[] args) {
            People people=new People() {
                @Override
                public void play() {
                    System.out.println("玩耍耍");
                }
            };
    
            people.play();
        }
    }
    
    abstract class People{
        public abstract void play();
    }

執行結果:玩耍耍。

可以看到,我們直接將抽象類Person中的方法在大括號中實現了,這樣便可以省略一個類的書寫。匿名內部類還能用於介面上。

案例3:在介面上使用匿名內部類

    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 11:01
     * @ Description:在介面上使用匿名內部類
     */
    public class Demo3 {
    
        public static void main(String[] args) {
            Man m=new Man() {
                @Override
                public void sleep() {
                    System.out.println("睡覺覺");
                }
            };
    
            m.sleep();
        }
    }
    
    interface Man{
        public void sleep();
    }

執行結果:睡覺覺。

由上面的例子可以得出結論,只要一個類是抽象的或是一個介面,那麼其子類中的方法都可以使用匿名內部類來實現。

最常用的情況就是在多執行緒的實現上,因為要實現多執行緒必須繼承Thread類或是繼承Runnable介面。

案例4:Thread類的匿名內部類實現

    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 11:06
     * @ Description:Thread類的匿名內部類實現
     */
    public class Demo4 {
        public static void main(String[] args) {
            Thread t=new Thread(){
                public void run(){
                    for (int i=0;i<=5;i++){
                        System.out.print(i);
                    }
                }
            };
            t.start();
        }
    }

案例5:Runnable介面的匿名內部類實現

    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 11:09
     * @ Description:Runnable介面的匿名內部類實現
     */
    public class Demo5 {
        public static void main(String[] args) {
            Runnable r = new Runnable() {
                public void run() {
                    for (int i = 1; i <= 5; i++) {
                        System.out.print(i + " ");
                    }
                }
            };
            Thread t = new Thread(r);
            t.start();
        }
    }

可以參考這篇文章有關於匿名內部類中多型的理解:http://blog.csdn.net/zahngjialiang/article/details/68946631