【问题标题】:Anonymous Classes - when are they created? [duplicate]匿名类 - 它们是什么时候创建的? [复制]
【发布时间】:2018-02-11 23:09:44
【问题描述】:

是否每次调用其封闭方法时都会创建一个匿名类(不是实例化,而是实际定义/加载该类)还是重用它们?例如:

public MyInterface getAnonymousMyInterface() {
 return new MyInterface(){
  public void doStuff(){
   System.out.println("did stuff");
  }
 }
}

调用getAnonymousMyInterface() 会创建两个不同的类吗?

【问题讨论】:

    标签: java anonymous-class


    【解决方案1】:

    不,它不会。 在编译时为匿名类创建一个类(格式为OuterClass$1.class),这就是类加载器加载的单个类。
    然后在运行时,每个 getAnonymousMyInterface() 调用将创建 MyInterface 匿名类的不同实例,因为 new 运算符会创建之后声明的类的新实例。

    【讨论】:

      【解决方案2】:

      我只是通过运行以下程序弄明白了:

      public class Main {
       public static interface MyInterface {
        void doStuff();
       }
       public static void main(String[] args) {
        System.out.println(getAnonymousMyInterface().getClass().equals(getAnonymousMyInterface().getClass()));
       }
      
      
       public static MyInterface getAnonymousMyInterface() {
        return new MyInterface() {
         public void doStuff() {
          System.out.println("did stuff");
         }
        };
       }
      

      这会打印出true,所以答案是否定的,一个匿名类被创建一次,每个实例都来自同一个类。

      【讨论】:

      • 你也可以看看输出的类文件,匿名类通常命名为Main$1.class。证明它是在编译时生成的。
      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2012-06-07
      相关资源
      最近更新 更多