Основы Java о ключевом слове final

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


person Abhishek Sanghvi    schedule 29.08.2009    source источник
comment
Лучше, если вы сможете сделать домашнюю работу, прежде чем задавать вопрос. Спрашивать совершенно нормально. Никаких возражений. Но я думаю, мы должны спросить обо всем. Поиск в Google дал это как первое попадание. en.wikipedia.org/wiki/Final_%28Java%29#Final_methods   -  person Chathuranga Chandrasekara    schedule 29.08.2009


Ответы (8)


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

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

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

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

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

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

person VoteyDisciple    schedule 29.08.2009
comment
вы должны добавить подраздел в свой ответ, различающий случай, когда переменная указывает на примитивный тип и ссылочный тип. Имеет ли это смысл? Затем я удалю -1, который я вам дал. - person Inquisitive; 06.07.2012
comment
Здесь нет различия между ссылочными и примитивными типами. Я предполагаю, что вы имеете в виду тот факт, что ссылочные типы не могут быть неизменяемыми, даже если переменная, указывающая на один, равна final? Если да, то это выходит за рамки первоначального вопроса. Тем не менее, вы можете комментировать конструктивно любым способом, который, по вашему мнению, улучшит существующие ответы. Однако, поскольку этому ответу уже несколько лет, и на сегодняшний день он был просмотрен всего 528 раз, я рекомендую сосредоточить ваши усилия на более актуальных вопросах. - person VoteyDisciple; 06.07.2012
comment
ваш ответ вводит в заблуждение, если не сказать больше. Возможно, его просмотрели n человек m раз, но это все равно вводит в заблуждение. Неизменяемость играет важную роль в дизайне классов. Так что это точно надо было упомянуть. - person Inquisitive; 06.07.2012
comment
Это определенно так! StackOverflow приветствует комментарии, улучшающие существующие ответы, и я уверен, что будущие читатели будут рады любым дополнительным пояснениям, которые вы хотели бы добавить. - person VoteyDisciple; 07.07.2012

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

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

Метод может быть объявлен окончательным, чтобы подклассы не могли его переопределить или скрыть. Попытка переопределить или скрыть окончательный метод является ошибкой времени компиляции.

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

person coobird    schedule 29.08.2009

Да.

Вы можете сделать метод final

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

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

  1. Когда метод является окончательным, он может быть встроен.
  2. Когда метод является окончательным, метод невозможно переопределить.
person Silfverstrom    schedule 29.08.2009
comment
Конечно, более реалистичным случаем является окончательный НЕстатический метод? - person Simon Nickerson; 29.08.2009

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

person jensgram    schedule 29.08.2009

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

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

    protected abstract void doPerformOperation();    // must override
}
person Sampson    schedule 29.08.2009

Да.

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

person Randell    schedule 29.08.2009

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

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

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

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

person Fortyrunner    schedule 29.08.2009

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

person Katie    schedule 28.07.2015