前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >匿名内部类何为匿名?

匿名内部类何为匿名?

作者头像
PhoenixZheng
发布2018-08-07 16:31:07
6960
发布2018-08-07 16:31:07
举报

学过Java的同学肯定听说过匿名内部类, 不过不知道有没有仔细的深究过它,

比如为什么称之为匿名? 为什么也算是一个类,而且是内部类? 它和内部类有什么区别?

匿名内部类

先来看一段匿名内部类的代码, 这里需要先定义一个抽象类,

代码语言:javascript
复制
abstract class Person {
    public abstract void doSomething();
}

大家应该都知道一个典型的匿名内部类是这样子的,

代码语言:javascript
复制
public class Demo {
    public static void main(String[] args) {
      Person person = new Person() {
          public void doSomething() {
              System.out.println("student reading");
          }
      };
      person.doSomething();
    }
}

对比与非匿名内部类, 匿名内部类省去了实现一个 Person的具体类的步骤, 比如说上面的代码可以用这样的非匿名内部类来实现,

代码语言:javascript
复制
public class Student extends Person {
    public void doSomething() {
        System.out.println("student reading");
    }
}

....
    Student person = new Student();
    person.doSomething();
匿名内部类的核心

使用匿名内部类,省去了新建一个类的过程。 虽然代码上看起来少了这个类,但其实在字节码中,还是有生成一个类的, 比如上面的代码 Demo类,在编译后会生成两个文件,

Demo.class Demo$1.class

可以用

javap -c Demo$1.class

来看看字节码里做了什么。

代码语言:javascript
复制
final class Demo$1 extends Person {
  Demo$1();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method Person."<init>":()V
       4: return

  public void doSomething();
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String student reading
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

可以看到,其实Demo$1就是一个标准的类, 相当于一个 Student类, 虽然我们没有继承 Person实现一个具体的类, 可是Java帮我们做了这件事, 如果你的开发经验足够丰富的话,有反编译的经验, 就会看到在一些jar包里有大量的 12为后缀的class文件, 其实这些都是匿名内部类来着。

所以现在知道匿名跟内部类是什么意思了吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 匿名内部类
  • 匿名内部类的核心
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档