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