Java基础--匿名内部类

一、什么是匿名内部类

  就是内部类的简化写法

前提:存在一个类或者接口(这里的类可以是具体类也可以是抽象类)

格式: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
原文地址:https://www.cnblogs.com/lxc116317/p/9620852.html