Voici un code où j'ai essayé de changer la valeur d'une variable finale. Il imprime d'abord "a" puis "ab". Donc, si nous pouvons changer la valeur d'une variable finale, quel est l'avantage de déclarer une variable finale? Quelle est alors l'utilité du mot clé final? S'il vous plaît, n'importe qui peut m'aider avec ça ?????
package test_new;
public class FinalVarValueChange {
public static void main(String[] args){
final StringBuffer s=new StringBuffer("a");
System.out.println("s before appending :"+s);
s.append("b");
System.out.println("s after appending :"+s);
}
}
final
n'applique aucun degré de constance de l'objet auquel se réfère une référence (c'est pas identique à const
en C++).
Lorsque vous marquez une variable comme final
, cela signifie que vous ne pouvez pas affecter une référence d'objet différente à cette variable.
Par exemple, ce code ne compilera pas:
final StringBuffer s=new StringBuffer("a");
s = new StringBuffer("another a"); /*not possible to reassign to s*/
Il peut être utile lors de l'utilisation de Runnables, Callables et des idiomes de verrouillage.
StringBuffer est modifiable selon sa conception, et la méthode append est juste une méthode pour changer son contenu.
Que signifie la variable finale dans Java est:
Pour objet, cela signifie que vous ne pouvez pas affecter un autre objet à cette référence, mais cela ne vous empêche pas d'appeler les méthodes de cet objet.
Pour les variables de type de base (int, float, boolean, etc.), car il n'y a pas de référence et de pointeur et de méthode d'objet ici, donc cela signifie simplement que vous ne pouvez pas changer la valeur de la variable.
Prenez les codes suivants
final ObjectA objA = new ObjectA();
Vous pouvez bien sûr invoquer des méthodes de cet objet comme ci-dessous
objA.setXXX() //legal for a final variable objA
L'effet secondaire de la méthode setXXX () n'est pas contrôlé par le mot clé final ici.
Mais pour le code suivant
final int a = 123;
Vous ne pourrez pas attribuer de nouvelle valeur à cette variable comme ci-dessous
a = 234; //Not legal if a has been defined as a final int variable.
Mais si vous le définissez en utilisant Integer comme ci-dessous
final Integer a = new Integer(123);
Vous pourrez invoquer des méthodes d'objet a comme ci-dessous
a.xxx()
La définition finale générale est différente pour l'objet et la variable de base.
final
modificateur signifie que vous ne pouvez pas changer de variable, c'est-à-dire la référence à votre objet, c'est-à-dire affecter une autre valeur à la même variable. Vous pouvez cependant changer l'état de l'objet lui-même.
variable finale/référence signifie que vous ne pouvez pas réaffecter une autre valeur à cette référence, mais vous pouvez changer l'état de l'objet.
Ici, vous modifiez l'état interne de StringBuffer
objet s
Le mot clé final garantit que le reference
, détenu par la variable, ne changera pas. Le state
de l'instance référencée peut changer. Ce que vous recherchez probablement est immutability
de l'instance référencée. C'est la responsabilité de l'instance.
Le "final" fait référence à la variable sb qui est une référence à un StringBuffer. Parce que c'est définitif, vous ne pouvez pas faire en sorte que sb fasse référence à un autre StringBuffer. Vous pouvez cependant (comme vous l'avez trouvé) modifier l'objet StringBuffer auquel se réfère actuellement sb. Essayez de compiler ce code
final StringBuffer sb = new StringBuffer();
sb.append("abc");
sb.append("xyz");
sb = new StringBuffer();