Какую цель в Java выполняют ключевые слова final, finally и finalize? [закрыто]

82

В Java, с какой целью сделать ключевые слова final, finallyи finalizeвыполнить?

Пэт Р. Эллери
источник
4
Вопрос о домашнем задании? allu.wordpress.com/2006/11/08/…
Серый
12
Это даже не сопоставимые концепции. Просто они пишутся одинаково. Почитайте.
Марсело Кантос,
3
Они не имеют ничего общего друг с другом - концептуально совершенно не связаны. Изучите каждую отдельно.
Эд Стауб
7
Этот вопрос не следует закрывать, поскольку это довольно распространенный вопрос.
Дэвид Титаренко
1
проголосовали за повторное открытие из-за хорошего ответа, который может быть полезен для пользователей, которые попадают сюда.
akappa

Ответы:

272

окончательный

final может использоваться для обозначения переменной "неизменяемой"

private final String name = "foo";  //the reference name can never change

final также может сделать метод не "переопределяемым"

public final String toString() {  return "NULL"; }

finalтакже может сделать класс не «наследуемым». т.е. класс не может быть разделен на подклассы.

public final class finalClass {...}
public class classNotAllowed extends finalClass {...} // Not allowed

Ну наконец то

finallyиспользуется в инструкции try / catch для выполнения кода "всегда"

lock.lock();
try {
  //do stuff
} catch (SomeException se) {
  //handle se
} finally {
  lock.unlock(); //always executed, even if Exception or Error or se
}

В Java 7 есть новая попытка с оператором ресурсов , который можно использовать для автоматического закрытия ресурсов, которые явно или неявно реализуют java.io.Closeable или java.lang.AutoCloseable

завершить

finalizeвызывается, когда объект собирается сборщиком мусора. Вам редко нужно его отменять. Пример:

protected void finalize() {
  //free resources (e.g. unallocate memory)
  super.finalize();
}
крико
источник
18
лучший ответ, чем в большинстве книг по Java !!
дневник
3
Спасибо. Этот ответ хорошо объясняется по сравнению с другими, которые называют себя «экспертами».
datnt 06
2
Хороший ответ, но подпись метода finalize неверна.
Samarth Shah
Примечание. Этот Object#finalize()метод устарел в Java 9 ( JDK-8165641 ).
Slaw
19
  • «Финал» означает, что что-то изменить нельзя. Обычно вы хотите использовать это для статических переменных, которые будут иметь одно и то же значение на протяжении всей жизни вашей программы.
  • «Наконец» используется вместе с блоком try / catch. Все, что находится внутри предложения «finally», будет выполнено независимо от того, генерирует ли код в блоке «try» исключение или нет.
  • «Finalize» вызывается JVM перед сборкой мусора.
Кевин Р
источник
6

Последнее ключевое слово используется для объявления констант.

final int FILE_TYPE = 3;

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

try
{
  //stuff
}
catch(Exception e)
{
  //do stuff
}
finally
{
  //this is always run
}

И наконец (ха-ха), finalize im не совсем уверен, что это ключевое слово, но в классе Object есть функция finalize () .

ctrlc-корень
источник
6

http://allu.wordpress.com/2006/11/08/difference-between-final-finally-and-finalize/

final - постоянное объявление.

finally - блок finally всегда выполняется при выходе из блока try, за исключением вызова System.exit (0). Это гарантирует выполнение блока finally даже в случае возникновения непредвиденного исключения. Но наконец, он полезен не только для обработки исключений - он позволяет программисту избежать случайного обхода кода очистки посредством возврата, продолжения или прерывания. Помещение кода очистки в блок finally всегда является хорошей практикой, даже если не ожидается никаких исключений.

finalize () - метод помогает в сборке мусора. Метод, который вызывается перед тем, как объект будет удален сборщиком мусора, что позволяет ему очистить свое состояние. Не следует использовать для освобождения ресурсов, не связанных с памятью, таких как дескрипторы файлов, сокеты, соединения с базой данных и т. Д., Потому что Java имеет только конечное количество этих ресурсов, и вы не знаете, когда сборка мусора будет запущена для освобождения этих ресурсов, не связанных с памятью через метод finalize ().

Вы пытались выполнить поиск в Google и нуждаетесь в пояснении?

Ворапсак
источник
4
Добро пожаловать в Stack Overflow! Хотя эта статья может на самом деле ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. Stack Overflow полезен настолько, насколько полезны его вопросы и ответы, и если этот хост блога выходит из строя или URL-адреса перемещаются, этот ответ становится бесполезным. Благодаря!
sarnold
6

final: final - ключевое слово. Переменная, объявленная как final, должна быть инициализирована только один раз и не может быть изменена. Классы Java, объявленные как final, не могут быть расширены. Методы, объявленные как final, не могут быть переопределены.

наконец: наконец-то блок.Блок finally всегда выполняется при выходе из блока try. Это гарантирует выполнение блока finally даже в случае возникновения непредвиденного исключения. Но наконец, он полезен не только для обработки исключений - он позволяет программисту избежать случайного обхода кода очистки при возврате, продолжении или прерывании. Помещение кода очистки в блок finally всегда является хорошей практикой, даже если не ожидается никаких исключений.

завершить: finalize - это метод. Перед сборкой мусора исполняющая система вызывает его метод finalize (). Вы можете написать код освобождения системных ресурсов в методе finalize () перед сборкой мусора.

яд
источник
2

1. Заключительный • Final используется для наложения ограничений на класс, метод и переменную. • Конечный класс не может быть унаследован, конечный метод не может быть переопределен, а конечное значение переменной не может быть изменено. • Конечные переменные инициализируются во время создания, за исключением случая пустой конечной переменной, которая инициализируется в Конструкторе. • Final - ключевое слово.

2. Наконец • Наконец, используется для обработки исключений вместе с попыткой и отловом. • Он будет выполняться независимо от того, обработано ли исключение или нет. • Этот блок используется для закрытия ресурсов, таких как соединение с базой данных, ресурсы ввода-вывода. • Наконец, блок.

3. Завершить • Finalize вызывается потоком сборки мусора непосредственно перед сбором подходящих объектов для выполнения очистки. • Это последний шанс для объекта выполнить какую-либо очистку, но поскольку не гарантируется, будет ли вызван finalize (), плохая практика - сохранять ресурс до вызова finalize. • Завершить - это метод.

Мулало Мадида
источник
0

Значение final в java: -применяется к переменной, означает, что соответствующая переменная после инициализации больше не может быть изменена

private final double numer = 12;

Если вы попытаетесь изменить это значение, вы получите сообщение об ошибке.

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

 public final void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }

Но метод final может быть унаследован, потому что ключевое слово final ограничивает переопределение метода.

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

class Base
{

    public void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }
}

Смысл слова finally:

class TestFinallyBlock{  
  public static void main(String args[]){  
  try{  
   int data=25/5;  
   System.out.println(data);  
  }  
  catch(NullPointerException e){System.out.println(e);}  
  finally{System.out.println("finally block is always executed");}  
  System.out.println("rest of the code...");  
  }  
} 

в этом примере, даже если try-catch выполняется или нет, то, что находится внутри finally, всегда будет выполняться. Смысл доработки:

class FinalizeExample{  
public void finalize(){System.out.println("finalize called");}  
public static void main(String[] args){  
FinalizeExample f1=new FinalizeExample();  
FinalizeExample f2=new FinalizeExample();  
f1=null;  
f2=null;  
System.gc();  
}}  

перед вызовом сборщика мусора.

Джанина Гайта
источник