匿名内部 class - getClass()

Anonymous inner class - getClass()

我写了下面的代码:

public class AnonymousClasses {

    public void sayHello(){

    }


public interface GreetingModule {
    public void sayHello();
}

public static void main(String[] args) {
    AnonymousClasses jonny = new AnonymousClasses(){
        @Override
        public void sayHello() {
            System.out.println("Hey");
        }
    };
    AnonymousClasses john = new AnonymousClasses(){
        @Override
        public void sayHello() {
            System.out.println("Hi");
        }
    };


    GreetingModule greeting = new GreetingModule() {

        @Override
        public void sayHello() {
            System.out.println("Hello");
        }


    };

    jonny.sayHello();
    john.sayHello();
    greeting.sayHello();

    System.out.println(jonny.getClass());
    System.out.println(john.getClass());
    System.out.println(greeting.getClass());

}

输出当然是:

你好

class AnonymousClasses$1

class AnonymousClasses$2

class AnonymousClasses$3

但是,当我按如下方式编辑代码时:

public class AnonymousClasses {

    private final GreetingModule greetingModule;

    public AnonymousClasses(GreetingModule greetingModule) {

        this.greetingModule = greetingModule;
    }

    public void saySomething() {
        greetingModule.sayHello();
    }


public interface GreetingModule {
    public void sayHello();
}

public static void main(String[] args) {
    AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
        @Override
        public void sayHello() {
            System.out.println("Hey");
        }
    });
    AnonymousClasses john = new AnonymousClasses(new GreetingModule(){
        @Override
        public void sayHello() {
            System.out.println("Hi");
        }
    });


    GreetingModule greeting = new GreetingModule() {

        @Override
        public void sayHello() {
            System.out.println("Hello");
        }


    };

    jonny.saySomething();
    john.saySomething();
    greeting.sayHello();

    System.out.println(jonny.getClass());
    System.out.println(john.getClass());
    System.out.println(greeting.getClass());

}

输出为:

你好

class 匿名类

class 匿名类

class AnonymousClasses$3

谁能解释一下,为什么在前两个 getClass() 方法中没有带有 dolar 的内部 class 的名称?还是内在的class?

您正在为第二个示例创建 class 的实例:

AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
    @Override
    public void sayHello() {
        System.out.println("Hey");
    }
});

要创建它的匿名子class,需要:

AnonymousClasses jonny = new AnonymousClasses(new GreetingModule(){
    @Override
    public void sayHello() {
        System.out.println("Hey");
    }
}) {
      // Overriding anything here is optional
};
当有 class.

的新未命名实现时,

$ 符号带有 class 名称

在第一个示例中,您将在每种情况下创建 AnonymousClasses 的新实现。

AnonymousClasses jonny = new AnonymousClasses(){
        @Override
        public void sayHello() {
            System.out.println("Hey");
        }
};

这类似于创建子class 的对象,以 AnonymousClasses 作为父 class。在这种情况下,由于子class没有名称,JVM 将 $1 附加到其父名称以创建唯一名称。

在第二个示例中,您只是创建了 AnonymousClasses 相同实现的新对象。它可能看起来很相似,但如果你仔细观察,每次你都在创建一个新的 GreetingModule 接口实现,它被传递给 AnonymousClasses 的构造函数。

在这两种情况下,都没有内部class。在第一个示例中,它们只是 AnonymousClasses 的 subclasses 的对象,在第二种情况下,它们是相同 AnonymousClasses.

的对象