目录
一、匿名内部类介绍
基本语法
二、举例说明
1.传统方式实现接口
2.使用匿名内部类进行简化
一、匿名内部类介绍
1.匿名内部类也是类
2.匿名内部类也是内部类
3.匿名内部类没有名字(名字存在于JVM中,不会显示出来)
4.匿名内部类同时还是一个对象
基本语法
二、举例说明
1.传统方式实现接口
package com.hspedu.innerclass;/*** 演示匿名内部类的使用*/
public class AnonymousInnerClass01 {public static void main(String[] args) {Outer04 outer04 = new Outer04();outer04.method();}
}class Outer04 { //外部类private int n1 = 10;//属性public void method() {//方法//基于接口的匿名内部类//1.需求:想使用接口IA,并创建对象//2.传统方式:,实现该接口,并创建对象实例IA tiger = new Tiger();//接口的多态tiger.cry();}}interface IA {//接口public void cry();
}
class Tiger implements IA{@Overridepublic void cry() {System.out.println("老虎叫唤...");}
}
同理,如果Dog类实现了接口IA,那么也是同样的流程
2.使用匿名内部类进行简化
package com.hspedu.innerclass;/*** 演示匿名内部类的使用*/
public class AnonymousInnerClass01 {public static void main(String[] args) {Outer04 outer04 = new Outer04();outer04.method();}
}class Outer04 { //外部类private int n1 = 10;//属性public void method() {//方法//基于接口的匿名内部类//1.需求:想使用接口IA,并创建对象//2.传统方式:,实现该接口,并创建对象实例//3.需求:Tiger/Dog类只使用一次,以后再也不使用//4.使用匿名内部类简化开发
// IA tiger = new Tiger();//接口的多态
// tiger.cry();IA tiger = new IA(){@Overridepublic void cry() {System.out.println("老虎叫唤...");}};tiger.cry();}}interface IA {//接口public void cry();
}
IA tiger = new IA(){@Overridepublic void cry() {System.out.println("老虎叫唤...");}};
上述代码是一个对象实例,是实现了IA接口的匿名内部类的对象实例
而真正的匿名内部类的内容是
{@Overridepublic void cry() {System.out.println("老虎叫唤...");}}
这个类是没有名字的,即匿名的
对象tiger的编译类型和运行类型
5.编译类型:IA
6.运行类型:匿名内部类,可以通过getClass()方法得到匿名内部类在JVM中的名字
运行结果
Outer04$1:即外部类+ $ + 序号
也就是说匿名内部类在底层的代码是
class Outer04$1 implements IA {@Overridepublic void cry() {System.out.println("老虎叫唤...");}}
7. jdk 底层在创建匿名内部类 Outer04$1,立即马上就创建了 Outer04$1 实例, 并且把地址
返回给 tiger
8. 匿名内部类使用一次, 就不能再使用,但是创建的对象可以多次使用