Основы Java о конечном ключевом слове - PullRequest
5 голосов
/ 29 августа 2009

Можно ли использовать ключевое слово final для метода?

Ответы [ 8 ]

19 голосов
/ 29 августа 2009

Абсолютно! Ключевое слово final может применяться практически ко всему, в каждом случае это означает, что «вы больше не можете это изменить».

Вот что это означает применительно к ...

переменная : Вы просто не можете присвоить переменной новое значение (конечно, константа )

метод : Вы не можете повторно реализовать (то есть переопределить) этот метод в подклассе

класс : вы не можете определить подкласс

В каждом случае мы просто указываем: как только эта вещь объявлена, это последнее значение (или реализация), которое вы когда-либо увидите для нее.

3 голосов
/ 29 августа 2009

Да, метод можно объявить как final. Это будет означать, что метод не может быть переопределен его подклассами.

С Спецификации языка Java, третье издание , Раздел 8.4.3.3 :

Метод может быть объявлен окончательным предотвратить подклассы от переопределения или скрывая это. Это ошибка времени компиляции попытаться переопределить или скрыть финал способ.

Для получения дополнительной информации, страница Написание финальных классов и методов на странице Учебные руководства по Java содержит больше информации.

2 голосов
/ 29 августа 2009

Да.

Вы можете сделать метод окончательным

public class A {
   public static final void f() {
      System.out.println("test");
   }
}

Как правило, есть две причины, чтобы сделать метод окончательным

  1. Когда метод является окончательным, он «может» быть встроенным.
  2. Когда метод является окончательным, метод невозможно переопределить.
1 голос
/ 29 августа 2009

Конечно, можно. Делать невозможным переопределение.

0 голосов
/ 28 июля 2015

да, последнее ключевое слово может быть использовано для метода. Это сохранит неизменность. это предотвращает разрыв методов между методами. Например, предположим, что реализация некоторого метода класса X предполагает, что метод M будет вести себя определенным образом. Объявление X или M как final не позволит производным классам переопределить M таким образом, что X будет вести себя неправильно.

0 голосов
/ 29 августа 2009

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

Большая часть кода, который я пишу в эти дни, предназначена для многопоточных сред, и я стремлюсь сделать класс final неизменным (если он является классом значений), чтобы обеспечить его безопасность для потоков.

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

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

0 голосов
/ 29 августа 2009

Да.

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

0 голосов
/ 29 августа 2009

Конечно, зацените Последнее слово в последнем ключевом слове

public abstract class AbstractBase
{
    public final void performOperation()    // cannot be overridden
    {
        prepareForOperation();
        doPerformOperation();   
    }

    protected abstract void doPerformOperation();    // must override
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...