Это похоже на создание объекта из интерфейса; как это работает? - PullRequest
10 голосов
/ 16 октября 2010
interface Int {
    public void show();
}

public class Test {     
    public static void main(String[] args) {
        Int t1 = new Int() {
            public void show() {
                System.out.println("message");
            }
        };

        t1.show();
    }
}

Ответы [ 4 ]

18 голосов
/ 16 октября 2010

Вы определяете анонимный класс, который реализует интерфейс Int, и немедленно создаете объект типа thatAnonymousClassYouJustMade.

8 голосов
/ 16 октября 2010

Это обозначение для

Int t1 = new MyIntClass();

// Plus this class declaration added to class Test
private static class MyIntClass implements Int
    public void show() {
        System.out.println("message");
    }
}

Итак, в конце вы создаете экземпляр конкретного класса, поведение которого вы определили встроенным.

Вы можете сделать это и с абстрактными классами, предоставив реализации для всех встроенных абстрактных методов.

4 голосов
/ 16 октября 2010

То, что этот специальный синтаксис для анонимных внутренних классов делает внутри, создает класс с именем Test$1. Вы можете найти этот файл класса в папке вашего класса рядом с классом Test, и если вы напечатаете t1.getClass().getName(), вы также увидите это.

0 голосов
/ 16 октября 2010

Я думаю, что ваш объект не имеет ничего общего с интерфейсом. Если вы закомментируете весь интерфейс, вы все равно получите тот же результат. Его просто анонимный класс создан. Я думаю, что если вы не используете класс «реализует», вы не можете реализовать интерфейс. Но я не знаю, как столкновение имен не происходит в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...