Что делает новый Object {}? - PullRequest
       16

Что делает новый Object {}?

1 голос
/ 12 октября 2011

Было трудно найти информацию об этом, потому что я не знаю, как она называется, так что это мой первый вопрос, я думаю.

Использует ли это обозначение:

new Object() {//code here}

создать новый объект типа Object или создать новый объект, который является подклассом объекта?Если это подкласс, можете ли вы поместить все, что вы могли бы использовать для объявления класса (переменные-члены, функции, внутренние классы) внутри фигурных скобок?Не могли бы вы даже написать конструктор для него?

Ответы [ 3 ]

6 голосов
/ 12 октября 2011

Это называется анонимный класс .По сути, вы определяете подкласс на месте.

Этот вызов:

Object a = new Object() {
   // stuff
};

.. определяет новый подкласс Object с //stuff в нем (точно так же как объявление этого вобычный A extends Object.

В Википедии есть хорошая статья о них тоже.

Они полезны в основном для замыканий, что означает, что функции, определенные в вашем анонимномкласс имеет доступ к final переменным из окружающей области.

Example-ish:

interface Function {
    void run();
}

static void example(Function f) {
    f.run();
}

void runExample() {
    final int a = 10;
    example(new Function() {
        void run() {
            // Notice that "a" was defined in the outer scope
            System.out.println(a);
        }
    });
}
2 голосов
/ 12 октября 2011
new Object() {
    //code here
}

Создает новый анонимный внутренний класс, который расширяет Object.Это полностью допустимый класс и может содержать все, что есть в обычном неанонимном классе.Хотя было бы непрактично объявлять новые методы внутри анонимного класса, поскольку они имели бы очень маленькую область видимости.

1 голос
/ 12 октября 2011
new Object() {
    //code here
}

Это действительно. Это создаст анонимный внутренний класс, который расширяет Object. Но вы не сможете сохранить свою ссылку. Ссылка, которую вы можете использовать, относится только к классу Object.

Object ob=new Object(){
    //code
}

Используя эту ссылку, вы можете получить доступ только к методам класса Object. Любые новые методы, объявленные в этом анонимном классе, не будут доступны. Определенно переопределенные методы могут быть использованы. Поэтому нет смысла создавать другие методы, которые вы никогда не сможете использовать. Также в этом классе вы не можете создать конструктор, так как это анонимный класс, который расширяет Object, и конструктор может быть создан только с именем класса, а вы не знаете имя класса.

...