Как это называется в Java, когда вы создаете экземпляр на лету? - PullRequest
4 голосов
/ 18 января 2012

В коде,

class MyObject {
   public String doThing() {
      return "doh";
   }
}

class MyClass {
   private myObject = null;
   public MyClass() {
       myObject = new MyObject() {
           public String doThing() {
              return "huh?";
           }
       };
   }

Как это называется, когда myObject назначается новый объект? Технически я пытаюсь выяснить, переопределяет ли метод doThing метод из MyObject или переопределяет его, но я понятия не имею, что искать, чтобы найти ответ - и не знаю, какой вопрос задать, не зная, что вызывается, когда вы создаете новый экземпляр объекта на лету и даете ему реализацию.

Ответы [ 5 ]

9 голосов
/ 18 января 2012

Вы создаете анонимный внутренний класс , который является подклассом MyObject, поэтому да, вы переопределяете метод doThing, если это то, что вы спрашиваете.

Кстати, анонимные классы похожи на именованные классы, у них есть свой собственный байт-код в их файле .class, который именуется как включающий их класс, к которому добавляется знак доллара и число.

Если вы хотите поэкспериментировать самостоятельно, вы можете использовать метод getClass() из myObject и извлечь информацию о нем, такую ​​как имя, родительский элемент, реализованные интерфейсы, общие аргументы и т. Д.

3 голосов
/ 18 января 2012

Это называется анонимным внутренним классом.

Учитывая, что метод doThing() имеет ту же сигнатуру, что и открытый метод в своем суперклассе, он переопределяет его.

Лучший способ убедиться в этом - добавить аннотацию @Override к методу в подклассе: компилятор выдаст ошибку компиляции, если метод с этой аннотацией не переопределит какой-либо метод.

2 голосов
/ 18 января 2012

Имя для этой структуры: Анонимный внутренний класс

Вы найдете множество документов об этом в Google

1 голос
/ 18 января 2012

Да, метод doThing() отменен. Это эквивалентно анонимному классу, который наследует поведение MyObject и затем переопределяет его.

1 голос
/ 18 января 2012

В Java все неконечные методы экземпляров подлежат переопределению (то есть виртуальным). Это в равной степени относится и к внутренним классам, поэтому ваш код переопределяет метод MyObject doThing().

...