java 匿名内部类整理

转载:
https://blog.csdn.net/weixin_33824385/article/details/114452126
匿名内部类之间的写法也项目中用过和见过,但是一直没有对这这种写法有个全面的认识,也怪自己基础太差。最近终于知道了,原来有个专业的称呼:匿名内部类。感觉其他网友也总结的挺好的,就奉行拿来主义,直接转载吧,也算个整理;
网友一:

一、匿名内部类的

java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类 。java提供了匿名内部类语法,用于帮助大家简化代码,本文简要从接口,抽象类以及常规类以代码的形式描述其常用模式。其实不管是接口中,抽象类,还是常规类派生出来的匿名内部类,其用法都是一样的

1. 接口模式

public interface IWriter
{
    void write();
}
public static void main(String[] args)
{
    IWriter writer = new IWriter()
    {
        Override
        public void write()
        {
            System.out.println("IWriter write...");
        }
    };
    writer.write();
}

2.抽象类

public abstract class AbstractWriter
{
    public abstract void write();
}
public static void main(String[] args)
{

/** 1.等号右边:是匿名内部类,定义并创建该接口的子类对象
 * 2.等号左边:是多态赋值,接口类型引用指向子类对象
**/
    AbstractWriter abstractWriter = new AbstractWriter()
    {
        Override
        public void write()
        {
            System.out.println("AbstractWriter write...");
        }
    };
   //调用 fly方法,执行重写后的方法

    abstractWriter.write();
}

3.常规类

public class TextWriter implements IWriter
{
    Override
    public void write()
    {
        System.out.print("text writer..");
    }
}
public static void main(String[] args)
{
    TextWriter textWriter = new TextWriter()
    {
        Override
        public void write()
        {
            System.out.println("TextWriter 2 write...");
        }
    };
    textWriter.write();
}

4.在线程中使用

public static void main(String[] args)
{
    Thread thread = new Thread()
    {
        Override
        public void run()
        {
            new IWriter()
            {
                Override
                public void write()
                {
                    System.out.println("IWriter thread write...");
                }
            }.write();
        }
    };
    thread.run();
}

匿名内部类作为参数传递

通常在方法的形式参数是接口或者抽象类时,也可以将匿名内部类作为参数传递。代码如下:

public class InnerDemo3 {
    public static void main(String[] args) {           
        /*
           创建匿名内部类,直接传递给showFly(FlyAble f)
        */
        showWriter( new IWriter(){
            public void IWriter() {
                System.out.println("我写了~~~");
            }
        });
    }

    public static void showWriter(IWriter f) {
        f.write();
    }
}

内部类编译后的文件

综上可以看出,其实不管是接口中,抽象类,还是常规类派生出来的匿名内部类,其用法都是一样的。之所以说这个是一个语法糖,其本质是编译器在编译的时候,将匿名内部类单独编译成不多个不同的class,这个和单独写实现类后再调用其实本质是一样,具体可以参见编译后生成目录.如下截图所示:
在这里插入图片描述
网友二:
转载:https://baijiahao.baidu.com/s?id=1600814193634680238&wfr=spider&for=pc

匿名内部类格式

本质:匿名内部类会隐式的继承一个类或者实现一个接口,或者说,匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象。

格式

new 类名/接口/抽象类(){

}

例如:

new Interface(){


}

网友三
转载:
https://www.cnblogs.com/libinhong/p/10990602.html

内部类总结

内部类访问特点

成员内部类可以直接访问外部类的成员变量和成员方法
外部类不可以直接访问内部类的成员变量和成员方法

外部类想要访问内部的成员: 得创建内部类对象来访问内部类成员

外部类名.内部类名 对象名 = new 外部类名().new 内部类名();

举个例子

public class Person {
    private  boolean live = true;
    class Heart {
        public void jump() {
            // 直接访问外部类成员
            if (live) {
                System.out.println("心脏在跳动");
            } else {
                System.out.println("心脏不跳了");
            }
        }
    }

    public boolean isLive() {
        return live;
    }

    public void setLive(boolean live) {
        this.live = live;
    }

}

public class InnerDemo {
    public static void main(String[] args) {
        // 创建外部类对象 
        Person p  = new Person();
        // 创建内部类对象
        Heart heart = p.new Heart();

        // 调用内部类方法
        heart.jump();
        // 调用外部类方法
        p.setLive(false);
        // 调用内部类方法
        heart.jump();
    }
}
输出结果:
心脏在跳动
心脏不跳了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值