• 匿名内部类的调用


    匿名对象之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名。

    class NoObject
    {
     
        void method()
        {
     
            System.out.println("Hello NoNameObj");
     
        }
     
     
    }
     
    class NoName
    {
     
        public static void main(String[] args) {
             
            new NoObject().method();// 这里创建完对象之后,并没有把对象直接赋值给某个值,而是创建完对象之后,直接调用对象,之后这个对象就不能被其他对象调用了<br>                        //因为要调用一个对象必须知道他的名字吧,没有名字怎么调用,这个就是匿名的概念。完事之后就成垃圾了不能再 调用了。
     
        }
     
    }

    平常内部类的调用

    class Outer
    {
    
        int num = 10;
    
        class Inner
        {
    
            void method()
            {
    
                System.out.println("The Outer Num is "+num);
    
            }
    
        }
    
        void sayInner()
        {
    
            new Inner().method();
    
        }
    
    }
    
    
    class InnerClassDemo2
    {
    
        public static void main(String[] args) {
            
            new Outer().sayInner();
    
        }
    
    }

    使用匿名对象的条件:

    内部类必须继承或者实现一个外部类接口,满足这个条件我们才能使用内部类。代码示例:

    abstract class AbsDemo
    {
    
        abstract void demo();
    
    }
    
    class Outer
    {
    
        int num = 10;
    
    
        void sayInner()
        {
            /**
            *这个地方我们直接new了一个父类或者接口类,但是这里有一点需要注意,那就是在new完了父类或者实现的接口之后,
            *后面要加上大括号,加上大括号的意义是在于表示,这是一个类,并且是new关键字后面的类或者接口的子类或者实现
            *之后我们在大括号后直接覆盖或者实现了类或者接口的方法
            */
            new AbsDemo()
            {
    
                void demo()
                {
    
                    System.out.println("This is a NoNameInnerClass Demo");
    
                }
    
            }.demo();//这个地方是非常容易出错的,往往我们new abs(){}之后就忘了调用,因为我们只是单纯的new abs(){}这个样子是没有
                     //任何意义的,为什么因为这个是个匿名的类,也就是说没有类名,你匿名定义之后完了,就不能再引用了。只能立即调用
                     //这个方法后才会变的有意义。还有一点就是这个匿名类定义调用完之后,不要忘了后面的分号结束语句,因为new之后就是
                     //一个语句了,而不是class声明了。
    
        }
    
    }
    
    
    class InnerClassDemo2
    {
    
        public static void main(String[] args) {
            
            new Outer().sayInner();
    
        }
    
    }

    匿名内部类通俗来说就是:就是一个匿名子类对象。定义的方法是:new 父类or接口(){子类内容}

    匿名内部类的应用:

    场景一:当函数参数是接口类型时,且接口方法不超过3个,此时我们可以采用匿名内部类来当参数传递。比如:

    interface InterfaceDemo
    {
    
        public void show1();
        public void show2();
    
    }
    
    class InnerClassDemo2
    {
    
        public static void main(String[] args) {
            
            method(new InterfaceDemo(){
    
                public void show1()
                {
    
                    System.out.println("Show 1");
    
                }
    
                public void show2()
                {
    
                    System.out.println("Show 2");
    
                }
    
            });
    
        }
    
        static void method(InterfaceDemo demo)
        {
    
            demo.show1();
            demo.show2();
        }
    
    }

    这里method()方法需要一个接口类型的对象传入,为了简便期间,我们直接用了匿名内部类对象进行了传递,这里还有一个地方需要注意,就是假如有现在这样的情况:

    class InnerClassDemo2
    {
    
        class Inner
        {
    
    
        }
    
        public static void main(String[] args) {
            
            new Inner();
    
        }
    
    
    }

    main函数是静态的,他无法调用静态上下文当中的非静态成员,此时class Inner{}在这个类当中就相当于一个成员,但是是非静态的自然而然会报错的。

    在这里还有一个多态的问题需要注意比如:

    interface InterfaceDemo
    {
    
        public void show1();
        public void show2();
    
    }
    
    class DuoTaiFalse
    {
    
        void method()
        {
    
            /**
            *这个地方发生了向上转型。即多态
            */
            InterfaceDemo inface = new InterfaceDemo(){
    
                public void show1()
                {
    
                    System.out.println("Show1");
    
                }
                public void show2()
                {
    
                    System.out.println("Show2");
    
                }
    
                public void show3()
                {
    
                    System.out.println("Show3");
    
                }
    
            };
    
            inface.show1();
            inface.show2();
            /**这个地方就是错误的,因为InterfaceDemo inface = new InterfaceDemo(){}当进行到这个地方的时候,就已经发生了
            *向上转型,也就是说这个时候,不能够调用除父类当中已经有的其他的方法。所以调用inface.show3()会提示错误
            */
            //inface.show3();
    
        }
    
    
    }
    
    class InnerClassDemo2
    {
    
        public static void main(String[] args) {
            
            new DuoTaiFalse().method();
    
        }
    
    }
  • 相关阅读:
    Eclipse 插件开发 —— 深入理解查找(Search)功能及其扩展点
    Spring Auto Scanning Components
    SSH架构简单总结
    eclipse进行开发
    jasper ireport create a report with parameters without sql query
    VARCHAR2转换为CLOB碰到ORA-22858错误
    cannot find w3wp.exe in VS
    10 things you should know about NoSQL databases
    Notifications Nagios
    Serializable
  • 原文地址:https://www.cnblogs.com/qq1312583369/p/10966530.html
Copyright © 2020-2023  润新知