匿名内部类的调用

摘要:
例如:interfaceInterfaceDemo{publicvoidshow1();publicvoidshow 2();}classInnerClassDemo2{publicstaticvoidmain{method;}staticvoidmethod{demo.show1(),demo.show2(),}}方法()需要传入接口类型的对象。为了简化过程,我们直接使用匿名内部类对象来传入。这里还有一点需要注意,如果classInnerClassDemo2{classInner{}publicstaticvoidmain{newInner();}}主函数是静态的,则它不能在静态上下文中调用非静态成员。此时,classInner{}相当于该类中的成员,但它是非静态的,将自动报告错误。

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

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

    }

}

免责声明:文章转载自《匿名内部类的调用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ISD9160学习笔记05_ISD9160语音识别代码分析docker服务编排--docker-compose下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

CAD转DXF怎么转换?教你三种转换方法

2.进入到CAD版本转换的界面中后,在选择“点击选择文件”,在跳转出的“打开”界面中打开需要转换的CAD图纸。...

Latex 双栏模式下表格太长怎么办?

有时一张桌子放不下任何一页。如果使用原始表包,它可能会溢出。因此,自动更改表格是很自然的。对于许多在线材料,建议使用Longtable。但是因为我的文章是双栏文章,所以这个包会有问题。例如,表格将只浮动在文本上,标题的显示也有问题。经过长时间的尝试,我终于找到了解决方案,而且非常简单。只需缩放表格。方法如下:egin{table*}[!...

cocosCreator中Protobuf的简单使用

CocosCreatorwebStorm或VSCode安装node.js下载protobufjs6.8.6步骤:...

【问题】如何批量导出AI文件里内嵌的图片

截止目前为止,新版的AI里面没有直接可以批量导出内嵌图片的选项,手动一个个导出实在太麻烦了。有人说用Phantasm插件可以导出,但新版的找不到对应支持的插件版本,所以这里就不说了。这里介绍一种简单粗暴的方法。...

谷歌浏览器中预览海康大华等监控视频的思路与方法

本人近些年来对海康,大华,宇视等视频厂商做过一些视频对接的开发,但始终存在一个问题,在谷歌浏览器中如何进行视频监控的预览。本文将主要解决在谷歌,火狐等非IE浏览器中预览视频监控问题,给广大开发者提供一个思路方法。现在谷歌浏览器中现已不支持ActiveXObject的创建及调用,这是由于chrome浏览器在45版本后不再提供对npapi插件的支持。这种方式基本...

uni-app 安卓和IOS更新方案

热更新资源,即重新安装应用程序,并更新js等前端代码。Android平台更新方案,详见上一篇文章https://www.cnblogs.com/tiandi/p/15331522.html二、2015年,IOS平台苹果发布了一项规定,禁止用户在应用程序中被提示进行版本更新。无法直接更新通用iOSAppstore的安装包。应用程序启动后,检查是否有新版本,该版...