简体   繁体   English

匿名内部类-getClass()

[英]Anonymous inner class - getClass()

I have written the following code: 我写了以下代码:

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

}

The output is of course: 输出当然是:

Hey

Hi 你好

Hello 你好

class AnonymousClasses$1 class AnonymousClasses $ 1

class AnonymousClasses$2 匿名类$ 2

class AnonymousClasses$3 匿名类$ 3

However, when I edit my code as follows: 但是,当我按如下方式编辑代码时:

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

}

the output is: 输出为:

Hey

Hi 你好

Hello 你好

class AnonymousClasses 类AnonymousClasses

class AnonymousClasses 类AnonymousClasses

class AnonymousClasses$3 匿名类$ 3

Can somebody explain me, why there is no name of the inner class with a dolar in the first two getClass() methods? 有人可以解释一下,为什么在前两个getClass()方法中没有带dolar的内部类名称吗? Is it still an inner class? 它仍然是一个内部阶级吗?

You are creating instances of the class on the second sample: 您将在第二个示例上创建该类的实例:

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

To create a anonymous subclass of it would like: 要创建一个匿名子类,它需要:

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

$ symbol comes with the class name when there is a new unnamed implementation of the class. 当类的新的未命名实现时,$符号随类名一起提供。

In the first example , you are creating new implementations of AnonymousClasses in each case. 在第一个示例中,您将分别创建AnonymousClasses的新实现。

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

It's similar to creating an object of a subclass with AnonymousClasses as the parent class. 这类似于使用AnonymousClasses作为父类创建子类的对象。 In this case, since there is no name for the subclass, JVM appends $1 to its parent's name to create a unique name. 在这种情况下,由于没有子类的名称,因此JVM将$ 1附加到其父名称中,以创建唯一名称。

In the second example , you are just creating new objects of same implementation of AnonymousClasses. 在第二个示例中,您只是创建与AnonymousClasses相同实现的新对象。 It might seem similar, but if you notice carefully, each time you are creating a new implementation of GreetingModule interface which is passed to the constructor of AnonymousClasses. 看起来似乎很相似,但是如果您仔细注意,每次创建GreetingModule接口的新实现时,该接口都会传递给AnonymousClasses的构造函数。

In both the cases, there is no inner class. 在这两种情况下,都没有内部类。 In first example, they are just the objects of subclasses of AnonymousClasses and in second case, they are objects of the same AnonymousClasses. 在第一个示例中,它们只是AnonymousClasses子类的对象,在第二种情况下,它们是相同AnonymousClasses的对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM