当前位置: 代码网 > it编程>编程语言>Java > Java重修笔记 第二十七天 匿名内部类

Java重修笔记 第二十七天 匿名内部类

2024年08月03日 Java 我要评论
2. 使用场景:需要实现接口,重写接口或类的方法,但只需要用到一次的类,可以用匿名内部类来简化开发,省去开发人员手动创建类和实现接口的过程,将这些过程交给编译器底层实现。3. 匿名内部类并不是真的没有类名,只是开发人员交给底层去分配,实际上系统底层会给匿名内部类分配类名,规则是“6. 和局部内部类一样,匿名内部类也可以直接访问外部类的所有成员,但。4. 使用匿名内部类必须new分配空间,所以它既是类也是对象,7. 和局部内部类一样,匿名内部类访问外部类成员依然要用“”,X是匿名内部类的编号,从1开始。
  • 匿名内部类

1. 定义:无类名(底层自动分配类名“外部类名$1”),既是类也是对象,定义在外部类的局部位置,例如方法体和代码块中,通过new类或接口并在大括号里重写方法来实现

2. 使用场景:需要实现接口,重写接口或类的方法,但只需要用到一次的类,可以用匿名内部类来简化开发,省去开发人员手动创建类和实现接口的过程,将这些过程交给编译器底层实现。直接new接口或类,在大括号里面实现所需的方法就可以了。编译类型是接口,运行类型是匿名内部类。

3. 匿名内部类并不是真的没有类名,只是开发人员交给底层去分配,实际上系统底层会给匿名内部类分配类名,规则是“外部类名$x”,x是匿名内部类的编号,从1开始。

4. 使用匿名内部类必须new分配空间,所以它既是类也是对象,这个类分配完空间后就不能再使用了

public class anonymousinnerclass {
    public static void main(string[] args) {
        outer04 outer04 = new outer04();
        outer04.method();
    }
}

class outer04 { // 外部类
    private int n1 = 10; // 属性

    // 基于接口的匿名内部类的使用
    public void method() { // 方法
        ia ia = new ia() {
            @override
            public void cry() {
                // 重写接口中的方法
                system.out.println("重写的方法...");
            }
        };
        ia.cry();
        system.out.println("匿名内部类的运行类型是: " + ia.getclass());
        system.out.println("============================");
        // 基于类的匿名内部类的使用
        father father = new father("jack") {
            @override
            public void test() {
                system.out.println("重写的方法...");
            }
        };
        father.test();
        system.out.println("匿名内部类的运行类型是: " + father.getclass());

    }
}

interface ia { // 接口
    public void cry();
}

abstract class father {
    public father(string name) { // 构造器
    }

    public abstract void test(); // 抽象方法
}

运行结果:

5. 因为匿名内部类返回的是一个对象,所以可以直接在后面通过"匿名内部类.方法名(参数列表)"的形式来直接调用方法。

public class anonymousdetail {
    public static void main(string[] args) {
        outer outer = new outer();
        outer.method();
    }
}

class outer {
    public void method() {
        new cat01("猫猫") {
            @override
            public void eat(object obj) {
                string str = (string) obj;
                system.out.println("猫吃: " + str);
            }
        }.eat("猫粮"); // 直接调用重写方法
    }
}

class cat01 {
    private string name;

    public cat01(string name) {
        this.name = name;
    }

    public void eat(object obj) {
    }
}

6. 和局部内部类一样,匿名内部类也可以直接访问外部类的所有成员,但外部类.this.外部类属性名

7. 和局部内部类一样,匿名内部类访问外部类成员依然要用“外部类.this.外部类属性名”的方式访问。

  • 匿名内部类的最佳实践
public class anonymousexercise02 {
    public static void main(string[] args) {
        cellphone cellphone = new cellphone();
        cellphone.alarmclock(new bell() {
            @override
            public void ring() {
                system.out.println("起床啦...");
            }
        });
        cellphone.alarmclock(new bell() {
            @override
            public void ring() {
                system.out.println("闹铃响了...");
            }
        });
    }
}

interface bell{
    void ring();
}

class cellphone {
    public void alarmclock(bell bell) {
        bell.ring();
    }
}

运行结果:

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com