У Java, яку мету виконують ключові слова `final`,` нарешті` та `finalize`? [зачинено]


82

В Java, з якою метою зробити ключові слова final, finallyі finalizeвиконати?


4
Питання домашнього завдання? allu.wordpress.com/2006/11/08/…
Сірий

12
Це навіть не порівнянні поняття. Вони просто пишуться подібним чином. Почитайте.
Марсело Кантос,

3
Вони не мають нічого спільного між собою - абсолютно не пов’язані між собою, концептуально. Вивчайте кожного окремо.
Ed Staub

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
Дякую. Ця відповідь добре пояснюється в порівнянні з іншими, що називаються ними "експертами".
дата

2
Хороша відповідь, але підпис методу finalize неправильний.
Самарт Шах,

Примітка:Object#finalize() метод був застарілим в Java 9 ( JDK-8165641 ).
Slaw

19
  • "Остаточний" означає, що щось не можна змінити. Зазвичай ви хочете використовувати це для статичних змінних, які матимуть однакове значення протягом життя вашої програми.
  • "Нарешті" використовується разом із блоком try / catch. Будь-що всередині речення "нарешті" буде виконано незалежно від того, чи код у блоці 'try' видає виняток чи ні.
  • JVM викликає "Finalize" перед тим, як об'єкт збирається збирати сміття.

6

Кінцеве ключове слово використовується для оголошення констант.

final int FILE_TYPE = 3;

Ключове слово нарешті використовується в операторі try catch для вказівки блоку коду, який буде виконуватися незалежно від викидів.

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

І нарешті (ха-ха), finalize я не зовсім впевнений, що це ключове слово, але функція finalize () є в класі Object.


6

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

остаточне - константне оголошення.

нарешті - Блок нарешті завжди виконується при виході блоку спроби, за винятком виклику System.exit (0). Це гарантує, що блок нарешті виконується, навіть якщо трапляється несподіване виняток. Але нарешті корисний не лише для обробки винятків - це дозволяє програмісту уникнути випадкового обходу коду очищення шляхом повернення, продовження чи злому. Внесення коду очищення в блок нарешті - це завжди хороша практика, навіть коли не передбачаються винятки.

finalize () - метод допомагає у збиранні сміття. Метод, який викликається до того, як об’єкт відкидається збирачем сміття, дозволяючи йому очистити свій стан. Не слід використовувати для звільнення ресурсів, що не належать до пам'яті, таких як дескриптори файлів, сокети, підключення до бази даних тощо, оскільки Java має лише кінцеву кількість цих ресурсів, і ви не знаєте, коли збиратиметься сміття, щоб звільнити ці ресурси, що не належать до пам'яті. за допомогою методу finalize ().

Ви пробували шукати в google і потребуєте роз’яснень для пояснення?


4
Ласкаво просимо до Stack Overflow! Хоча ця стаття насправді може відповісти на питання, переважно було б включити сюди основні частини відповіді та надати посилання для посилання. Переповнення стеку настільки корисне, як і його запитання та відповіді, і якщо цей хост блогу не працює або URL-адреси переміщуються, ця відповідь стає марною. Дякую!
sarnold

6

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

нарешті: нарешті - це блок. Блок нарешті завжди виконується, коли виходить блок спроби. Це гарантує, що блок нарешті виконується, навіть якщо трапляється несподіване виняток. Але нарешті корисний не лише для обробки винятків - це дозволяє програмісту уникнути випадкового обходу коду очищення шляхом повернення, продовження чи злому. Внесення коду очищення в блок нарешті - це завжди хороша практика, навіть коли не передбачаються винятки.

finalize: finalize - це метод. Перш ніж об’єкт збирається сміттям, система виконання викликає метод finalize (). Ви можете написати код випуску системних ресурсів у методі finalize () перед тим, як збирати сміття.


2

1. Final • 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 обмежує перевизначення методу.

-застосований до класу означає, що відповідний клас не можна розширити.

class Base
{

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

Сенс нарешті:

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...");  
  }  
} 

у цьому прикладі, навіть якщо спроба-лову виконана чи ні, те, що знаходиться всередині нарешті, завжди буде виконано. Значення завершити:

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();  
}}  

перед викликом Сміттєзбирача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.