匿名内部类-getClass()

时间:2019-04-08 18:49:38

标签: java inner-classes anonymous-class

我写了以下代码:

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());

}

输出为:

你好

AnonymousClasses

AnonymousClasses

class AnonymousClasses $ 3

有人可以解释一下,为什么在前两个getClass()方法中没有带dolar的内部类名称?它仍然是一个内部阶级吗?

2 个答案:

答案 0 :(得分:3)

您要在第二个示例上创建该类的实例:

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

要创建其匿名子类,则需要:

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

答案 1 :(得分:1)

当类的新的未命名实现时,

$符号随类名一起出现。

在第一个示例中,您将分别创建新的AnonymousClasses实现。

SELECT payoutBbf.totalPyts

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

在第二个示例中,您只是创建与AnonymousClasses相同实现的新对象。看起来似乎很相似,但是如果您仔细注意,每次创建新的GreetingModule接口实现时,该接口都会传递给AnonymousClasses的构造函数。

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