возможно ли переопределить функции Java на уровне экземпляра?

#java

#java

Вопрос:

Я просматриваю некоторый Java-код, написанный давно и не являющийся разработчиком Java, у меня есть вопрос. Я нашел следующие строки в теле класса. Кто-то создает экземпляр SearchQueryParameter, однако после «new SearchQueryParameter» есть фигурные скобки, и кажется, что кто-то переопределил некоторые функции здесь.

Мои вопросы следующие.

1) Перезаписываются ли эти функции на уровне экземпляра?

2) Есть ли у этой языковой функции имя?

 public static final SearchQueryParameter X_POSTDOC_WORKFLOW_STEP = new SearchQueryParameter(128,"XPOSTDOCWorkflowStep",AdvancedFields.X_EVENT_POSTDOC_WFSTEP,SearchTypes.XEVENT_DOCUMENTS) {

    @Override
    protected int getFilterType() {
        return SEARCH_FILTER;
    }

    <<snip>>
};
  

Спасибо, mj

Комментарии:

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

Ответ №1:

Предыстория:

Это называется анонимным классом. Это класс, который расширяет не final класс или реализует единый интерфейс, и вы создаете один экземпляр этого класса.

Теперь, к вашим вопросам:

1) Перезаписываются ли эти функции на уровне экземпляра?

Нет, они находятся на уровне класса. У вас есть новый подкласс нужного класса, и этот подкласс переопределяет метод. Затем вы создаете новый экземпляр подкласса.

2) Есть ли у этой языковой функции имя?

Да, это анонимный класс.

Комментарии:

1. Функция переопределяется на уровне экземпляра и на уровне класса, а не на одном или другом; пока создается новое определение класса, другой экземпляр этого определения никогда не может быть создан. (о чем вы не упоминаете.)

2. @aPerson в Java, по определению, ссылочное значение (экземпляр) не может определять какой-либо метод, поэтому экземпляр не может переопределить метод. Это анонимный класс, который переопределяет метод, и тогда у вас есть экземпляр этого класса.

3. @Apersonвы можете создать новый экземпляр анонимного класса, если хотите. (ОТРАЖЕНИЕ YOLO)

4. @SotiriosDelimanolis Это правда, но для получения другого экземпляра требуется отражение.

Ответ №2:

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

Комментарии:

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

2. Действительно, важно понимать, что, хотя анонимные подклассы создают «ощущение» переопределения на уровне экземпляра, на самом деле они этого не делают. Вызов getClass() для экземпляра показывает другое имя класса!

Ответ №3:

Код создает экземпляр анонимного класса ( SearchQueryParameter ), а затем переопределяет в нем один метод.

По сути, это создает что-то, что расширяет SearchQueryParameter класс и переопределяет getFilterType() метод.

Поскольку может быть создан только один экземпляр этого конкретного определения класса (без отражения), функция может выглядеть так, как будто она переопределяется на уровне экземпляра, но на самом деле переопределяется на уровне класса (поскольку она может заменить существующее определение).

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

Комментарии:

1. функция переопределяется на уровне экземпляра , это неверно. Ссылка на объект вообще не может определять какой-либо метод. Методы определены только в классах, и здесь у вас есть экземпляр анонимного класса, и анонимный класс переопределяет метод, а не экземпляр.

2. Обновленный ответ, отражающий (badum-tss) это.