关于Java中的匿名内部类

匿名内部类

1.概述

匿名内部类:

  • 本质上是一个没有名字的局部内部类,定义在方法中、代码块中等
  • 作用:方便创建子类对象,最终目的是为了简化代码编写

格式:

new|抽象类名|接口名(){
	重写方法;
};
Employee a = new Employee(){
	public void work(){
		System.out.println("好好工作");
	}
}
a.work();

需求:

开发一个动物园的动物表演方法,要求有各种各样的动物在表演。

  • 不采用匿名内部类

代码演示

public class Test {
    public static void main(String[] args) {

        Animal a = new Tiger();  //使用多态形式 惯用写法

        a.run();   //编译看左边 运行看右边
    }
}

//定义一个实现类 也就是子类  这是采用常规做法
class Tiger implements Animal{

    @Override
    public void run() {
        System.out.println("开始");
        System.out.println("老虎跑的很快");
        System.out.println("结束");
    }
}

 interface Animal{

    public void run();
}

说明

上述代码中,我们没有采用匿名内部类,首先声明一个动物的接口,里面有run方法,然后接着定义了一个Tiger实现类去实现Animal接口,重写run方法,然后在主方法调用并执行。

  • 采用匿名内部类

代码演示

public class Test {
    public static void main(String[] args) {

        Animal a = new Animal(){

            @Override
            public void run() {
                System.out.println("开始");
                System.out.println("老虎跑的很快");
                System.out.println("结束");
            }
        };  //使用多态形式 惯用写法

        a.run();   //编译看左边 运行看右边
    }
}

interface Animal{

    public void run();
}

说明

还是上面的代码,这里我们不用再定义一个子类去实现Animal接口,而是直接采用匿名内部类的形式,这里的 new Animal(){}

整体就是一个匿名内部类,因为有new关键字,所以实际上这里产生了匿名内部类的一个对象,该对象的类型相当于是当前new的那个类型的子类类型。

其实,上面的代码还可以写成这样:

public class Test {
    public static void main(String[] args) {

        Animal s = new Animal() {
            @Override
            public void run() {
                System.out.println("老虎跑的很快");
            }
        };
        
        go(s);  

    }
    
    System.out.println("-----------------");
    

    public static void go(Animal a){
        System.out.println("开始跑步");
        a.run();
        System.out.println("结束跑步");
    }
}

interface Animal{

    public void run();
}
 //新来一个对象狮子的时候 直接采用下面这个语句 更加简洁
     go(new Animal() {
            @Override
            public void run() {
                System.out.println("狮子跑的也很快");
            }
        });

代码执行流程:

首先,new Animal() {} 相当于是创建了一个对象,把这个对象的地址交给s,后面调用类中的静态方法go,进到go方法里边,在go里面调用重写的run方法,这里用到了一个机制,叫做 对象回调机制

2.匿名内部类特点

  • 匿名内部类是一个没有名字的内部类
  • 匿名内部类写出来就会产生一个匿名内部类的对象
  • 匿名内部类的对象类型相当于是当前new的那个类型的子类类型

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...
win11本地账户怎么改名?win11很多操作都变了样,用户如果想要...