Анонимный внутренний класс - getClass () - PullRequest
1 голос
/ 08 апреля 2019

Я написал следующий код:

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

}

Вывод конечно:

Эй

Привет

Hello

класс AnonymousClasses $ 1

класс AnonymousClasses $ 2

класс 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());

}

вывод:

Эй

Привет

Hello

класс AnonymousClasses

класс AnonymousClasses

класс AnonymousClasses $ 3

Может кто-нибудь объяснить мне, почему в первых двух методах getClass () нет имени внутреннего класса с доларом? Это все еще внутренний класс?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2019

Вы создаете экземпляры класса во втором примере:

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
};
2 голосов
/ 08 апреля 2019
Символ

$ поставляется с именем класса, когда существует новая безымянная реализация класса.

В первом примере вы создаете новые реализации AnonymousClasses в каждом случае.

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

Это похоже на создание объекта подкласса с AnonymousClasses в качестве родительского класса. В этом случае, поскольку для подкласса нет имени, JVM добавляет $ 1 к имени своего родителя, чтобы создать уникальное имя.

Во втором примере вы просто создаете новые объекты той же реализации AnonymousClasses. Это может показаться похожим, но если вы внимательно заметите, каждый раз, когда вы создаете новую реализацию интерфейса GreetingModule, которая передается конструктору AnonymousClasses.

В обоих случаях нет внутреннего класса. В первом примере они являются просто объектами подклассов AnonymousClasses, а во втором случае они являются объектами одного и того же AnonymousClasses.

...