zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    py 6.4
    py 5.31
    Java集合之LinkedHashMap常用方法解析
    Java集合之HashMap常用方法解析
    Java集合之LinkedList常用方法解析
    Java集合之ArrayList常用方法解析
    Java 基础知识
    Java wait和notifyAll的使用,简单的阻塞队列实现
    The main resource set specified [/tmp/tomcat-docbase.5063501203886177649.7000] is not valid
    zuul网关过滤器实现对GET请求的参数替换
  • 原文地址:https://www.cnblogs.com/lxc116317/p/9620852.html
Copyright © 2011-2022 走看看