"new Foo() {}" vs. "new Foo()" в Java

например:

Object o1 = new ArrayList<String>();
Object o2 = new ArrayList<String>(){};
Object o3 = new ArrayList<String>(){{}};

какая разница?

Я не могу google из 2-го/3-го грамматика java, любой ссылки?

Ответы

Ответ 1

Первый создает ArrayList

Второй создает анонимный подкласс ArrayList, который имеет определенный общий тип String

Третий тот же, но у него есть блок инициализатора, который пуст.

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

Ответ 2

Object o1 = new ArrayList<String>();

Создает ArrayList.

Object o2 = new ArrayList<String>(){};

Здесь вы создаете анонимный класс, который расширяет ArrayList<String> и не отменяет ничего. Так что разница в том, что вы подклассифицируете ArrayList без переопределения поведения, никогда не делайте этого, если у вас нет веской причины.

Object o3 = new ArrayList<String>(){{}};

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

Ответ 3

Object o1 = new ArrayList<String>();

Создание нового объекта ArrayList и назначение его o1

Object o2 = new ArrayList<String>(){};

Создание нового экземпляра анонимного класса, который расширяет ArrayList и назначает его o2

Object o3 = new ArrayList<String>(){{}};

Создание нового экземпляра анонимного класса (отличного от o2), который расширяет ArrayList, который имеет инициализатор экземпляра no-op.

Функционально классы анонов, назначенные o2 и o3, эквивалентны, но технически они будут разными классами.

Ответ 4

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

Ответ 5

o3 по-прежнему является экземпляром анонимного подкласса ArrayList, который имеет пустой блок инициализации экземпляра (внутренний {}).

Ответ 6

// Instantiate an object of type `ArrayList<String>`
Object o1 = new ArrayList<String>();

// Instantiate an anonymous subclass of `ArrayList<String>`
Object o2 = new ArrayList<String>(){};

// Instantiate an anonymous subclass of `ArrayList<String>` with an empty initializer block
Object o3 = new ArrayList<String>(){{}};

Ответ 7

Object o2 = new ArrayList<String>(){};
это анонимный внутренний класс, который расширяет класс ArrayList и ничего не отменяет.
Object o2 = new ArrayList<String>(){{}};
это также анонимный внутренний класс, который расширяет класс ArrayList и не отменяет ничего, но имеет empty instance block.