Finalize is a method in Java. This finalizes () method is similar to the main method. This finalizes () method is called just before the object is garbage collected. It means the original object’s last chance to perform cleanup activities like releasing system resources, closing connections like database, file open connection, etc. The main problem with the finalize method is there is no guarantee by Java Language Specification (JLS) that will be called by garbage collector or when it will be called. Let’s consider an example that an object may wait up to an indefinite time after the object becomes eligible for garbage collection. It means before its finalize() method is called. Same way, after finalizing the method called it is no guarantee, it will be immediately collected. So there is no sense to perform critical activities inside the finalize() method. It may work in one JVM, and it may not work in other JVM at the time of development.finalize() method is available inside java.lang.Object so that it is automatically available to all the classes for overriding as Object is the classes’ base class.
This finalizes () method is called before an object is garbage collected, so it means we can’t call finalize() method manually just like other Java methods. finalize() method called only once by garbage collector(GC) thread.
ADVERTISEMENT Popular Course in this category FINANCIAL MODELING & VALUATION - Specialization | 51 Course Series | 30 Mock TestsStart Your Free Software Development Course
Web development, programming languages, Software testing & others
Code:
protected void finalize throws Throwable { //write some code }
The finalize() method has an empty implementation, and in our class, clean-up activities are present, then we have to override this finalize() method to define our cleanup activities.
Below are some examples mentioned:
Finalize method user overriding method example
Code:
Main.java
//creating class public class Main { //main method for run the Java application public static void main(String[] args) { //Creating String object with some content String string = new String("I am Amardeep"); //make the string reference to null for allow it for Garbage Collection string = null; // Calling gc method for Garbage Collection System.gc(); //displaying some message to the user System.out.println("\tI am in Main method"); } //We are Overriding finalize method. public void finalize() { //displaying some message to the user System.out.println("\tI am feeling that I am Overriding finalize method"); } }
Output:
Explanation: If you observe the above output, you might be surprised that you did not finalize the overriding method. If you closely observe the code that is not actual Java given overridden method, it is just like a user-created method as we know actual finalize method signature protected void finalize(). So we did not get this in the output.
Finalize method overriding actual method example
Code:
Main.java
//creating class public class Main { //main method for run the Java application public static void main(String[] args) { //Creating Main object Main main = new Main(); //make the main reference to null for allow it for Garbage Collection main = null; // Calling gc method for Garbage Collection System.gc(); //displaying some message to the user System.out.println("\tI am Amardeep from main method"); } //We are Overriding finalize method. @Override protected void finalize() { //displaying some message to the user System.out.println("\tI am actaully Overriding now."); } }
Output:
Explanation: As we see in the above output, we finalize() method output because of overriding the actual finalize() method.
Finalize method from finally block example
Code:
Main.java
//creating class public class Main { //main method for run the Java application public static void main(String[] args) { //Creating Main object Main main = new Main(); //make the main reference to null for allow it for Garbage Collection main = null; // Calling gc method for Garbage Collection System.gc(); //displaying some message to the user System.out.println("\tI am Amardeep from main method"); } //We are Overriding finalize method. @Override protected void finalize() throws Throwable { try{ //displaying some message to the user System.out.println("\tFinalize of Paramesh"); }catch(Throwable t){ throw t; }finally{ //displaying some message to the user System.out.println("\tCalling finalize from finally block"); super.finalize(); } } }
Output:
Finalize method not guaranteed example
Code:
FinalizeNotGuarantee.java
//package com.finalize; public class FinalizeNotGuranteed implements Runnable { //user defined method private void getMyMethod() throws InterruptedException { //try block try { System.out.println("Hi, I am TRY"); throw new NullPointerException(); //catch block } catch (NullPointerExceptionnpe) { System.out.println("Hi, Iam CATCH"); //finally block } finally { System.out.println("Hi, I am FINALLY"); } } //overriding finalize method @Override protected void finalize() throws Throwable { System.out.println("I am kinside finalize block"); super.finalize(); } //overriding Thread run method @Override public void run() { try { getMyMethod(); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { for (int i = 1; i<= 3; i++) { //start the thread method run by using start method new Thread(new FinalizeNotGuranteed()).start(); } } }
Output:
Explanation: The above example clearly illustrates that the finalize method not always guarantee to execute.
Java finalizes () method is used to collect the garbage collected object. This method is called just before the GC() method is called. This method is not always guaranteed to execute.
The above is the detailed content of Finalize in Java. For more information, please follow other related articles on the PHP Chinese website!