专栏首页Phoenix的Android之旅匿名内部类何为匿名?

匿名内部类何为匿名?

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

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

匿名内部类

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

abstract class Person {
    public abstract void doSomething();
}

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

public class Demo {
    public static void main(String[] args) {
      Person person = new Person() {
          public void doSomething() {
              System.out.println("student reading");
          }
      };
      person.doSomething();
    }
}

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

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

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

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文件, 其实这些都是匿名内部类来着。

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

本文分享自微信公众号 - Android每日一讲(gh_f053f29083b9),作者:Phoenix

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 说一个小bug

    这个bug其实很简单,因为String是不可变内容的,想获得新值,必须重新赋值。正确应该是

    PhoenixZheng
  • 只用一行代码的单例模式

    作为Android开发者对Kotlin语言应该不会陌生, 下面这个单例模式就是用Kotlin写的,

    PhoenixZheng
  • Flutter来了,你慌了吗

    在刚过去的一周里Google公布了第一个预览版的Flutter, Flutter 的首个「发布预览版」全球发布 如果你接触过React-Native的话,Fl...

    PhoenixZheng
  • JavaWeb——JQuery之五种选择器的应用及实践案例总结(基本选择器、层级选择器、属性选择器、过滤选择器、表单过滤选择器)

    2)入口函数:(function () {});       注意:window.onload 和(function () 的区别, 前者只能定义一次,定义多次...

    Winter_world
  • Android JNI出坑指南

    笔者结合自身经验、网上资料对 JNI 的坑进行总结,如果有不正确或遗漏之处欢迎指出。

    腾讯Bugly
  • Spring Cloud 服务端注册与客户端调用

      上一篇中,我们已经把Spring Cloud的服务注册中心Eureka搭建起来了,这一章,我们讲解如何将服务注册到Eureka,以及客户端如何调用服务。

    小忽悠
  • java匿名内部类

    匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示: new <...

    郭耀华
  • 中国蝉联澳大利亚昆士兰州最大国际游客来源国 | 每周文旅资讯精选

    ? ? 买春运火车票部分列车最高打七折 2019年春运大幕即将开启,近日,北京青年报记者从北京西站了解到,目前涉及北京铁路的折扣方案已经出炉,春节前回空...

    腾讯文旅
  • 代码优化-多态代替IF条件判断

    在开发的场景中,常常会遇到打折的业务需求,每个用户对应的等级,他们的打折情况也是不一样的。例如普通会员打9折,青铜会员打8.5折,黄金会员打8折等等。在一般开发...

    小码农薛尧
  • spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例

    使用 Java EE - Eclipse 新建一 Dynamic Web Project

    noteless

扫码关注云+社区

领取腾讯云代金券