JAVA基础(匿名内部类)

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载,违者必究。 https://blog.csdn.net/Cricket_7/article/details/91490142

1,匿名内部类的格式和理解,

【1】匿名内部类

  • 就是内部类的简化写法。

【2】前提:存在一个类或者接口

  • 这里的类可以是具体类也可以是抽象类。

【3】格式:

    new 类名或者接口名(){

            重写方法;

        }

【4】本质是什么呢?

  • 是一个继承了该类或者实现了该接口的子类匿名对象。

【5】案例演示  

  * 按照要求来一个匿名内部类

class Demo1_NoNameInnerClass {

    public static void main(String[] args) {

        Outer o = new Outer();

        o.method();

    }

}



interface Inter {

    public void print();

}



class Outer {

    class Inner implements Inter {

        public void print() {

            System.out.println("print");

        }

    }

    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();

        

        /*

            new一个类,小括号,大括号是

            继承这个类,或者是实现这个借口.

        */





        new Inter(){                

            public void print(){

                System.out.println("我是匿名内部类");

            }

        }.print();

        

    }

}

        

2,匿名内部类重写多个方法调用)

【1】 匿名内部类的方法调用

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();                        //匿名内部类是不能向下转型的,因为没有子类类名

    }

}

3,匿名内部类在开发中的应用

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");

    }

}

4,练习

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”

猜你喜欢

转载自blog.csdn.net/Cricket_7/article/details/91490142