1. 程式人生 > >Java基礎--匿名內部類

Java基礎--匿名內部類

span sys rac sed hid 具體類 分析 urn 開發

一、什麽是匿名內部類

  就是內部類的簡化寫法

前提:存在一個類或者接口(這裏的類可以是具體類也可以是抽象類)

格式:new 類名或者接口名(){

   重寫方法;  

}

二、匿名內部類的本質是什麽?

是一個繼承了該類或者實現了該接口的子類的匿名對象

技術分享圖片
class Demo1_NoNameInnerClass {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

interface Inter {
    public void print();
}

class Outer { public void method(){ //Inner i = new Inner(); //i.print(); //new Inner().print(); //Inter i = new Inner(); //父類引用指向子類對象 new Inter() { //實現Inter接口 public void print() { //重寫抽象方法 System.out.println("print"); } }.print(); } }
View Code

三、匿名內部類重寫多個方法調用

技術分享圖片
class Demo2_NoNameInnerClass {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

interface Inter {
    public void show1();
    public void show2();
}
//匿名內部類只針對重寫一個方法時候使用
class Outer {
    public void method() {
        
/*new Inter(){ public void show1() { System.out.println("show1"); } public void show2() { System.out.println("show2"); } }.show1(); new Inter(){ public void show1() { System.out.println("show1"); } public void show2() { System.out.println("show2"); } }.show2();*/ Inter i = new Inter(){ public void show1() { System.out.println("show1"); } public void show2() { System.out.println("show2"); } /*public void show3() { System.out.println("show3"); }*/ }; i.show1(); i.show2(); //i.show3(); //匿名內部類是不能向下轉型的,因為沒有子類類 名 } }
View Code

結論:匿名內部類只針對重寫一個方法時候使用

四、匿名內部類在開發中的應用

匿名內部類當做參數傳遞(本質把匿名內部類看做一個對象)

技術分享圖片
class Test1_NoNameInnerClass {
    public static void main(String[] args) {
        //如何調用PersonDemo中的method方法呢?
        PersonDemo pd = new PersonDemo ();
        //pd.method(new Student());
        pd.method(new Person() {
            public void show() {
                System.out.println("show");
            }
        });
    }
}
//這裏寫抽象類,接口都行
abstract class Person {
    public abstract void show();
}

class PersonDemo {
    
    //public void method(Person p) {        //Person p = new Student();        //父類引用指向子類對象
    /*
    Person p = new Person(){
        public void show() {
            System.out.println("show");
        }
    };
    */
    public void method(Person p) {
        p.show();
    }
}

class Student extends Person {
    public void show() {
        System.out.println("show");
    }
}
View Code

簡單的說就是new 抽象類/接口,然後重寫方法。

五、匿名內部類的面試題

按照要求,補齊代碼

class OuterDemo{

  public static void main(String[] args){

    Outer.method().show();

  }

}

interface Inter{

  void show();

}

class Outer{

//補齊代碼

}

要求在控制臺輸出“HelloWorld”

分析:

  Outer.method(),用類去調用方法說明該類是靜態的

  Outer.method().show(),說明Outer.method()返回的是一個對象,有show方法的只有Inter

技術分享圖片
class Test2_NoNameInnerClass {
    public static void main(String[] args) {
        //Outer.method().show();            //鏈式編程,每次調用方法後還能繼續調用方法,證明調用方法返回的是對象
        Inter i = Outer.method();
        i.show();
    }
}
//按照要求,補齊代碼
interface Inter { 
    void show(); 
}

class Outer { 
    //補齊代碼 
    public static Inter method() {
        return new Inter() {
            public void show() {
                System.out.println("show");
            }
        };
    }
}

//要求在控制臺輸出”HelloWorld”
View Code

Java基礎--匿名內部類