Анонимный класс в Java - PullRequest
       2

Анонимный класс в Java

0 голосов
/ 08 декабря 2011

Можно ли создать анонимный класс в Java следующим образом:

public static void main(String[] args) {

    AnonymousClass a = new AnonymousClass() {
        int whatever = 1;
    };

    System.out.println(a.whatever);
}

Я думал, что это будет работать, но это не так. Что-то не так с анонимными классами или есть только синтаксическая ошибка?

Ответы [ 5 ]

4 голосов
/ 08 декабря 2011

Вы можете сделать это следующим образом:

public static void main(String[] args) {
    System.out.println(new Object() {
      int whatever = 1;
    }.whatever);
}

То есть вы можете извлекать поля и метод только из непосредственного выражения выражения.[ Редактировать: В комментариях вы можете использовать его там, где компилятор выводит для вас тип - который является выражением экземпляра, или как возвращаемое значение из универсального метода, которому вы передаете его.] Выне может хранить его в переменной и использовать там поля / методы, поэтому он не так полезен, как анонимные классы, например, в C #.

Редактировать: Вы можете, как ранее заявили другие,объявите локальный метод-метод:

public static void main(String[] args) {
    class Local {
      int whatever = 1;
    }
    Local local = new Local();
    System.out.println(local);
}

Немного многословно, хотя, как и нестатические внутренние классы и обычные анонимные классы, он сохраняет неявную ссылку на включающий this (в нестатических методах).

2 голосов
/ 08 декабря 2011

Чтобы это работало, AnonymousClass должен быть интерфейсом или классом:

private interface AnonymousClass {

}

public static void main(String[] args) {

        AnonymousClass a = new AnonymousClass() {
            int whatever = 1;
        };

    System.out.println(a.whatever); // this won't work
}

РЕДАКТИРОВАТЬ

Исправлено, как правильно указано в комментарии, whatever не будет доступно / представлено.

2 голосов
/ 08 декабря 2011

Если бы это было возможно, мы бы больше не называли их анонимными: ваш пример определяет класс с именем: Anonymous. Вы можете определить внутренний класс с именем, подобным этому:

public static void main(String[] args) {
    class NotAnonymous {
        public int whatever = 1;
    }
    NotAnonymous na = new NotAnonymous();
    System.out.println(na.whatever);
}
0 голосов
/ 08 декабря 2011

Вы можете создать свой класс, как это, конечно. Однако вызов a.whatever не удастся, потому что тип объекта по-прежнему AnonymousClass, и он не определяет whatever в качестве атрибута.

Если вы перезаписываете какой-либо метод или атрибут, который уже определен в классе или интерфейсе AnonymousClass, объект будет использовать вашу реализацию из анонимного класса вместо старого, но не если вы вводите новые методы или атрибуты.

0 голосов
/ 08 декабря 2011

Вы ссылаетесь на оригинальный экземпляр анонимного класса, у которого нет поля «что угодно», поэтому вы не можете ссылаться на него таким образом.

...