Jaki cel w Javie spełniają słowa kluczowe „final”, „final” i „finalize”? [Zamknięte]

82

W Javie, jaki cel zrobić słowa kluczowe final, finallya finalizespełnić?

Pat R Ellery
źródło
4
Pytanie do zadania domowego? allu.wordpress.com/2006/11/08/…
Gray
12
To nie są nawet porównywalne koncepcje. Po prostu są pisane podobnie. Poczytaj trochę.
Marcelo Cantos
3
Nie mają ze sobą nic wspólnego - zupełnie niezwiązane koncepcyjnie. Przestudiuj każdy z osobna.
Ed Staub
7
Nie należy tego zamykać, ponieważ wydaje się, że jest to stosunkowo częste pytanie.
David Titarenco
1
głosowało za ponownym otwarciem ze względu na dobrą odpowiedź, która może być przydatna dla użytkowników, którzy tu wylądują.
akappa

Odpowiedzi:

272

finał

final można użyć do oznaczenia zmiennej jako „niezmiennej”

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

final może również uniemożliwić „nadpisanie” metody

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

finalmoże również sprawić, że klasa nie będzie „dziedziczona”. tj. klasa nie może być podklasą.

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

Wreszcie

finallyjest używany w instrukcji try / catch do wykonywania kodu „zawsze”

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

Java 7 ma nową próbę z instrukcją zasobów , której można użyć do automatycznego zamykania zasobów, które jawnie lub niejawnie implementują java.io.Closeable lub java.lang.AutoCloseable

sfinalizować

finalizejest wywoływana, gdy obiekt jest odśmiecany. Rzadko trzeba to zmienić. Przykład:

protected void finalize() {
  //free resources (e.g. unallocate memory)
  super.finalize();
}
krico
źródło
18
lepsza odpowiedź niż większość książek Java !!
diaryfolio
3
Dziękuję Ci. Ta odpowiedź jest dobrze wyjaśniona w porównaniu z innymi nazywanymi siebie „ekspertami”.
data
2
Dobra odpowiedź, ale podpis metody finalizacji jest błędny.
Samarth Shah
Uwaga: ta Object#finalize()metoda była nieaktualna w Javie 9 ( JDK-8165641 ).
Slaw
19
  • „Final” oznacza, że ​​czegoś nie można zmienić. Zwykle chcesz użyć tego na zmiennych statycznych, które będą miały tę samą wartość przez cały okres użytkowania programu.
  • „Wreszcie” jest używane w połączeniu z blokiem try / catch. Cokolwiek wewnątrz klauzuli „last” zostanie wykonane niezależnie od tego, czy kod w bloku „try” zgłosi wyjątek, czy nie.
  • JVM wywołuje „Finalize”, zanim obiekt zostanie wyrzucony do pamięci.
Kevin R.
źródło
6

Ostatnie słowo kluczowe służy do deklarowania stałych.

final int FILE_TYPE = 3;

Słowo kluczowe last jest używane w instrukcji try catch do określenia bloku kodu do wykonania niezależnie od zgłoszonych wyjątków.

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

I na koniec (haha), finalize im nie do końca pewien jest słowem kluczowym, ale w klasie Object istnieje funkcja finalize () .

ctrlc-root
źródło
6

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

final - stała deklaracja.

w końcu - blok Final jest zawsze wykonywany, gdy blok try kończy działanie, z wyjątkiem wywołania System.exit (0). Zapewnia to wykonanie ostatniego bloku, nawet jeśli wystąpi nieoczekiwany wyjątek. Ale w końcu jest przydatny nie tylko do obsługi wyjątków - pozwala programistom uniknąć przypadkowego obejścia kodu czyszczącego przez powrót, kontynuację lub przerwanie. Umieszczanie kodu porządkującego w bloku final jest zawsze dobrą praktyką, nawet jeśli nie przewiduje się żadnych wyjątków.

finalize () - metoda pomaga w usuwaniu elementów bezużytecznych. Metoda, która jest wywoływana, zanim obiekt zostanie odrzucony przez moduł odśmiecania pamięci, umożliwiając mu wyczyszczenie jego stanu. Nie powinno być używane do zwalniania zasobów niezwiązanych z pamięcią, takich jak uchwyty plików, gniazda, połączenia z bazą danych itp., Ponieważ Java ma tylko skończoną liczbę tych zasobów i nie wiesz, kiedy zostanie uruchomione czyszczenie pamięci, aby zwolnić te zasoby niezwiązane z pamięcią za pomocą metody finalize ().

Czy próbowałeś wyszukiwać w Google i potrzebujesz wyjaśnienia?

Vorapsak
źródło
4
Witamy w Stack Overflow! Chociaż ten artykuł może faktycznie odpowiedzieć na to pytanie, lepiej byłoby zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Przepełnienie stosu jest tak przydatne, jak jego pytania i odpowiedzi, a jeśli ten host bloga przestanie działać lub adresy URL zostaną przeniesione, ta odpowiedź stanie się bezużyteczna. Dzięki!
sarnold
6

final: final to słowo kluczowe. Zmienna zadeklarowana jako ostateczna powinna zostać zainicjowana tylko raz i nie można jej zmienić. Nie można rozszerzać klas Java zadeklarowanych jako końcowe. Metody zadeklarowane jako ostateczne nie mogą zostać zastąpione.

wreszcie: wreszcie jest blokiem. Ostatni blok jest zawsze wykonywany, gdy blok try kończy działanie. Gwarantuje to, że ostatni blok zostanie wykonany, nawet jeśli wystąpi nieoczekiwany wyjątek. Ale w końcu jest przydatny nie tylko do obsługi wyjątków - pozwala programistom uniknąć przypadkowego pominięcia kodu czyszczącego przez powrót, kontynuację lub przerwanie. Umieszczanie kodu porządkującego w bloku final jest zawsze dobrą praktyką, nawet jeśli nie przewiduje się żadnych wyjątków.

finalize: finalize to metoda. Zanim obiekt zostanie wyrzucony bezużytecznie, system wykonawczy wywołuje jego metodę finalize (). Możesz napisać kod zwalniający zasoby systemowe w metodzie finalize () przed zebraniem elementów bezużytecznych.

jad
źródło
2

1. Finał • Finał służy do ograniczenia klasy, metody i zmiennej. • Ostateczna klasa nie może być dziedziczona, ostateczna metoda nie może być nadpisana i nie można zmienić końcowej wartości zmiennej. • Zmienne końcowe są inicjalizowane w momencie tworzenia, z wyjątkiem przypadku pustej zmiennej końcowej, która jest inicjowana w Konstruktorze. • Finał to słowo kluczowe.

2. Wreszcie • Final jest używany do obsługi wyjątków razem z try and catch. • Zostanie wykonane niezależnie od tego, czy wyjątek jest obsługiwany, czy nie. • Ten blok jest używany do zamykania zasobów, takich jak połączenie z bazą danych, zasoby we / wy. • Wreszcie jest blokiem.

3. Finalizacja • Finalizacja jest wywoływana przez wątek wyrzucania elementów bezużytecznych tuż przed zebraniem kwalifikujących się obiektów w celu wykonania czyszczenia. • Jest to ostatnia szansa dla obiektu na wyczyszczenie, ale ponieważ nie ma gwarancji, że wywołanie finalize () jest złe, to zła praktyka polegająca na zatrzymywaniu zasobów do zakończenia wywołania. • Finalizacja to metoda.

Mulalo Madida
źródło
0

Znaczenie finału w java jest następujące: -zastosowane do zmiennej oznacza, że ​​po zainicjowaniu odpowiedniej zmiennej nie można już modyfikować

private final double numer = 12;

Jeśli spróbujesz zmodyfikować tę wartość, pojawi się błąd.

-applied to a method oznacza, że ​​nie można przesłonić odpowiedniej metody

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

Ale ostatnią metodę można dziedziczyć, ponieważ słowo kluczowe final ogranicza przedefiniowanie metody.

-applied to a class oznacza, że ​​odpowiednia klasa nie może zostać rozszerzona.

class Base
{

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

Ostatecznie znaczenie jest:

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

w tym przykładzie, nawet jeśli try-catch jest wykonywany, czy nie, to, co jest w środku, będzie zawsze wykonywane. Znaczenie finalizacji:

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

przed wywołaniem Garbage Collectora.

Gianina Gaita
źródło