java中的匿名内部类总结

匿名内部类也就是没有名字的内部类

正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

 

实例1:不使用匿名内部类来实现抽象方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
abstract class Person {
     public abstract void eat();
}
 
class Child extends Person {
     public void say () {
         System.out.println( "helloword" );
     }
}
 
public class Demo {
     public static void main(String[] args) {
         Person p = new Child();
         p.eat();
     }
}

运行结果:helloword

可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用

但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

这个时候就引入了匿名内部类

 

实例2:匿名内部类的基本实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
abstract class Person {
     public abstract void eat();
}
 
public class Demo {
     public static void main(String[] args) {
         Person p = new Person() {
             public void say () {
                 System.out.println( "helloword" );
             }
         };
         p.eat();
     }
}

运行结果:helloword

可以看到,我们直接将抽象类Person中的方法在大括号中实现了

这样便可以省略一个类的书写

并且,匿名内部类还能用于接口上

 
实例3:在接口上使用匿名内部类
interface Person {
     public void eat();
}
 
public class Demo {
     public static void main(String[] args) {
         Person p = new Person() {
             public void say () {
                 System.out.println( "helloword" );
             }
         };
         p.eat();
     }
}

运行结果:helloword

 

由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现

最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口

 

实例4:Thread类的匿名内部类实现
public class Demo {
     public static void main(String[] args) {
         Thread t = new Thread() {
             public void run() {
                 for ( int i = 1 ; i <= 5 ; i++) {
                     System.out.print(i + " " );
                 }
             }
         };
         t.start();
     }
}

运行结果:1 2 3 4 5

 

实例5:Runnable接口的匿名内部类实现
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Demo {
     public static void main(String[] args) {
         Runnable r = new Runnable() {
             public void run() {
                 for ( int i = 1 ; i <= 5 ; i++) {
                     System.out.print(i + " " );
                 }
             }
         };
         Thread t = new Thread(r);
         t.start();
     }
}

运行结果:1 2 3 4 5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java匿名内部类是指在定义一个类的同时实例化它的对象,但没有为该类定义一个具体的类名。在编译期间,Java编译器会为匿名内部类生成一个与外部类关联的特殊名称的class文件,并且在运行期间通过反射进行实例化和调用。 通过对匿名内部类的字节码进行分析,可以了解到以下几点: 1. 匿名内部类的class文件命名规则:Java编译器会为匿名内部类生成一个特殊的名称,一般格式为"外部类名$数字.class",其外部类名为包含匿名内部类的外部类的名称,数字是一个递增的整数,用于区分不同的匿名内部类。 2. 匿名内部类的继承关系:在生成的class文件匿名内部类会继承一个特殊的父类和实现特殊的接口,以便实现外部类定义的抽象方法或接口方法。 3. 匿名内部类的访问:匿名内部类在访问外部类的成员变量或方法时,会将它们保存在一个特殊的隐藏字段,并通过构造函数或方法的参数传递给匿名内部类的构造函数或方法。 4. 匿名内部类的实例化:在外部类实例化匿名内部类时,会先调用匿名内部类的构造函数,在构造函数进行必要的初始化操作,并且可以重写父类或接口的方法。 5. 匿名内部类的调用:生成的class文件匿名内部类的方法以特殊的命名方式进行定义,用于实现外部类定义的方法。 总结来说,通过分析匿名内部类的字节码,可以了解到匿名内部类的继承关系、访问方式、实例化过程和调用方式,从而深入了解Java匿名内部类的工作原理和实现机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值