Java >> Tutoriel Java >  >> Tag >> final

Comparez final, finally et finalize() en java

finale

1) 'finale' est un modificateur d'accès ou un modificateur de mot clé.

2) Ce modificateur d'accès est applicable pour les classes, les méthodes et les variables.

Exemple 1 : Déclarer la classe comme final

final class FinalClass{
	public static void main(String[] args){
		System.out.println("Hi,this is final class");
	}
}

Sortie (Description)

Chaque fois que nous déclarons une classe comme finale, nous devons donc écrire le modificateur final avant le mot-clé de la classe.

E:\javasource>java FinalClass
Hi,this is final class

Exemple 2 : Déclarer la méthode comme final

class FinalMethod{
	final void finalMethod(){
		System.out.println("Hi,this is final method");
	}
	
	public static void main(String[] args){
		FinalMethod fm = new FinalMethod();
		fm.finalMethod();
	}
}

Sortie (Description)

Chaque fois que nous déclarons une méthode comme final, nous devons donc écrire le modificateur final avant le type de retour de la méthode.

E:\javasource>java FinalMethod
Hi,this is final method

Exemple 3 : Déclarer la variable comme final

class FinalVariable{
	final int a = 10;

	public static void main(String[] args){
		FinalVariable fv  = new FinalVariable();
		System.out.println("Hi,"+fv.a+" is final variable");
	}
}

Sortie (Description)

Chaque fois que nous déclarons une variable comme finale, nous devons donc écrire le modificateur final avant le type de retour de la variable.

E:\javasource>java FinalVariable
Hi,10 is final variable

3) Lorsqu'une classe est déclarée finale, cela signifie que la création d'une classe enfant n'est pas possible ou, en d'autres termes, nous pouvons dire que la classe finale ne peut pas être héritée, c'est pourquoi la création d'une classe enfant n'est pas possible.

Exemple : Création de classe enfant impossible pour la classe finale

final class FinalClass{
	public static void main(String[] args){
		System.out.println("Hi,this is final class");
	}
}
class ChildClass extends FinalClass{
}

Sortie (Description)

Chaque fois que nous essayons d'hériter de FinalClass alors nous aurons une erreur de compilation car nous ne pouvons pas créer la classe enfant de la classe finale.

E:\javasource>javac ChildClass.java
ChildClass.java:11: cannot inherit from final FinalClass
class ChildClass extends FinalClass{
1 error

4) Lorsqu'une méthode est déclarée finale, cela signifie que nous ne pouvons pas remplacer la méthode finale car la méthode finale sera telle qu'elle est dans la classe enfant, nous ne pouvons pas modifier l'implémentation car nous savons déjà que final est final, nous ne pouvons pas modifier ou son implantation est fixe.

Exemple 1 : Essayez de remplacer la méthode finale de la classe parent dans la classe enfant.

class ParentClass{
	final void finalMethod(){
		System.out.println("Hi,this is actual final method");
	}
}
class ChildClass extends ParentClass{
	final void finalMethod(){
		System.out.println("Hi,this is overrideable final method");
	}
}

Sortie (Description)

Chaque fois que nous essayons de remplacer la méthode finale de la classe parent dans la classe enfant, nous obtenons une erreur de compilation.

E:\javasource>javac ChildClass.java
ChildClass.java:10: finalMethod() in ChildClass cannot override finalMethod() in
 ParentClass; overridden method is final
        final void finalMethod(){
                   ^
1 error

Exemple 2 : Méthode finale de la classe parent utilisée telle quelle dans la classe enfant (non prioritaire).

class ParentClass{
	final void finalMethod(){
		System.out.println("Hi,this is parent class final method");
	}
}
class ChildClass extends ParentClass{
	public static void main(String[] args){
		ParentClass pc = new ParentClass();
		pc.finalMethod();
	}
}

Sortie (Description)

Chaque fois que nous ne remplaçons pas la méthode finale de la classe parent dans la classe enfant, aucune méthode finale de la classe parent d'erreur de temps de compilation ne sera exécutée.

E:\javasource>java ChildClass
Hi,this is parent class final method.

5) Lorsqu'une variable est déclarée finale, nous ne pouvons pas réaffecter la même variable finale (ou modifier à nouveau la valeur de la variable finale) car elle est fixe ou constante.

Exemple : Essayez de réaffecter la variable finale.

class FinalVariable{
	final int a = 10;
	a = 20;
	
	public static void main(String[] args){
		System.out.println("Hi,"+a+" is final variable");
	}
}

Sortie (Description)

Chaque fois que nous essayons de réaffecter la variable finale, nous obtenons une erreur de temps de compilation.

E:\javasource>javac FinalVariable.java
FinalVariable.java:11: cannot inherit from final FinalClass
class ChildClass extends FinalClass{
                         ^
1 error

enfin

1) C'est un bloc.

2) Cela bloque enfin toujours associé à try catch.

Syntaxe :

try{
	//Risky Code
}
catch{
	// Handling Code
}
finally{
	//Resource releasing activity
}

3) Il est utile dans la gestion des exceptions et utilisé pour maintenir les ressources de nettoyage (par exemple :fermeture de l'objet de connexion de la base de données).

4) Ce bloc sera toujours exécuté, que l'exception soit déclenchée ou non et que l'exception soit gérée ou non. Parce que dans ce bloc, nous maintenons une activité de libération de ressources, ce bloc doit donc être exécuté de toute façon.

Exemple 1 : Exception levée.

class TryCatch
{
	public static void main(String[] args){
		try
		{	
			int a =5;
			int b =0;
			int c = a/b;
		}
		catch(Exception e)
		{
			System.out.println(e);
		}
		finally{
			System.out.println("finally block will be executed whether exception raised or not");
		}
	}
}

Sortie (Description)

Ici, l'exception est déclenchée dans l'instruction a/b et immédiatement ctrl transféré au bloc catch et affiche l'exception souhaitée.

E:\javasource>java TryCatch
java.lang.ArithmeticException: / by zero
finally block will be executed whether exception raised or not

Exemple 2 : Exception non levée.

class TryCatch
{
	public static void main(String[] args){
		try
		{	
			int a =5;
			int b =5;
			int c = a/b;
			System.out.println("no exception raised");
		}
		catch(Exception e)
		{
			System.out.println(e);
		}
	}
}

Sortie (Description)

Lorsque l'exception n'est pas déclenchée dans le bloc try, le bloc catch ne sera pas exécuté.

E:\javasource>java TryCatch
no exception raised

finaliser()

  • C'est une méthode.
  • Cette méthode doit être exécutée par le ramasse-miettes avant de détruire tout objet pour effectuer des activités de nettoyage. Cela signifie que la méthode finalize() ne peut pas être exécutée manuellement ou par l'utilisateur.

Remarque : nous ne pouvons pas nous attendre à un comportement exact du ramasse-miettes lorsque le ramasse-miettes appellera, puis la méthode finalize () sera exécutée.


Balise Java