Pourquoi final de l'instance de variable de classe en Java?
Si la variable d'instance est définie final sa valeur ne peut pas être changé comme
public class Final {
private final int b;
Final(int b) {
this.b = b;
}
int getFinal() {
return b = 8; //COMPILE TIME ERROR
}
}
Quelque part dans le code, j'ai vu instance de variable de classe HashMap a déclaré que final
private final Map<String, Object> cacheMap = new HashMap<String, Object>();
Je ne pouvais pas comprendre pourquoi il est déclaré? Normalement le cas dans lequel elle est déclarée. Signifie-t-il si une fois j'ai mis dans hachage carte, alors je ne pouvais pas changer sa valeur?
Edit:
Si cacheMap qui est déclaré comme définitif est transmis comme paramètre à une autre classe alors l'erreur n'est pas indiqué pour la finale de si je change de référence. Pourquoi c'est ainsi?
class CacheDTO {
private Map conditionMap;
public Map getConditionMap() {
return conditionMap;
}
public void setConditionMap(Map conditionMap) {
this.conditionMap = conditionMap;
}
}
Puis
private final Map<String, Object> cacheMap = new HashMap<String, Object>();
CacheDTO cc = new CacheDTO();
cc.setConditionMap(cacheMap);
Map<String, Object> cacheMapDeclaredAsFinal = cc.getConditionMap();
Map<String, Object> newMap = new HashMap<String, Object>();
cacheMapDeclaredAsFinal = newMap; //In this case no error is shown. Though cacheMapDeclaredAsFinal reference is obtained by calling cc.getConditionMap() and cacheMapDeclaredAsFinal refers to final.
OriginalL'auteur abishkar bhattarai | 2013-09-27
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas modifier le Panier. De même vous pouvez changer les fruits à l'intérieur.
De Spécification du langage # chapitre 14.12.4
Lorsque vous déclarez une
field
oureference
final, vous devez définir la valeur d'une fois par le temps, le constructeur sort.Vous pouvez affecter une valeur à cette variable uniquement dans le constructeur.
ici vous pouvez faire
dans la classe.
mais vous ne pouvez pas faire
Vous devez connaître la différence entre
value
etreference
.Modifier
Ici
Raison ,
Depuis
cachemapdeclaredasfinal
n'est pas une nouvelle carte, c'est une autre référence deconditionMap
lorsque vous créez une nouvelle instance comme ce
Que l'erreur disparaisse. depuis que vous avez utilisé nouveau.
Edit 2 :
Ici ce que vous confondre.
De l'affectation d'un
final
déclarémap
à certaines normal(nonfinal
)map
. Quand vous avez récupéré que la normale seulement que vous obtenez et qui nefinal
de sorte que vous pouvez utiliser/assign
.En Bref
J'ai mis à jour. Espérons que cela aide.
Bonne Explication. Mais peut me faire clair sur une chose, pourquoi est finalMap.mettre(....) n'a aucune erreur, bcz, il est en train de changer la variable finale comme Java Règles états Finale variables sont constantes ne peuvent pas être modifiés. Alors pourquoi pas d'erreur de compilation à finalMap.mettre(...) ???
Vous ne m'a dit maintenant
Final variable are constant cannot be changed
. Et docs ditIf a final variable holds a reference to an object, then the state of the object may be changed by operations on the object, but the variable will always refer to the same object.
Donc un état de référence peut changer. non pas à l'ensemble de référence.Ok donc comme je le comprends maintenant.. que la finale de la variable de référence ne peut pas être changée si le maintenir.
OriginalL'auteur ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ
final
n'a rien à voir avec le contenu de l'objet de la variable de référence. Vous ne pas être en mesure de modifier la valeur de la variable et de faire référence à un autre objet.OriginalL'auteur Marko Topolnik
Final signifie que vous ne pouvez pas modifier la référence à l'objet. En cas de primitives, cela signifie que vous ne pouvez pas modifier la valeur. Ainsi, lorsque vous essayez de mettre b à 8, vous obtiendrez une erreur de compilation.
En Java - "les Références à des objets sont passés par valeur" (Comme Bruce Eckel le met dans son livre "Thinking in Java"). Afin de transmettre une copie de la référence. Donc, vous avez 2 références pour le même cacheMap maintenant.
Vous pouvez changer la cacheMap aide de l'une des références. Mais vous pouvez réaffecter seulement le "copié" référence à un autre objet, comme il n'est pas définitive (pas l'original, l'original est définitive et NE peut point à un autre objet).
OriginalL'auteur TheLostMind
Que les autres réponses ont spécifié, vous ne pouvez pas faire une dernière variable reportez-vous à un autre objet.
Citant le Java Langage De Spécification:
Que la règle n'a pas été violé en l'édités partie de votre question:
Vous avez déclaré
CacheMap
final, et vous n'êtes pas la réaffectation d'unevaleur n'importe où. Si vous voulez être en mesure de le faire, ce serait une
violation.
cachemapdeclaredasfinal
seulement fait référence à la même chose queCacheMap
estse référant à l', et est pas final lui-même.
Que Suresh a mentionné upthread, il serait utile si vous lisez sur les valeurs et les références en Java. Un bon point de départ est ce fil: Est Java "passage par référence"?. Assurez-vous de comprendre pourquoi Java est toujours passé par valeur et jamais par référence - c'est la raison pour laquelle le "finalness" de
CacheMap
n'étais pas passé autour.OriginalL'auteur AbdullahC
Cela signifie que le hasmap ne peut pas être modifié. Les éléments à l'intérieur de la table de hachage ne sont pas liés à la délimiteur final.
OriginalL'auteur Michaël Benjamin Saerens
Cette question pourrait vous aider: http://www.stackoverflow.com/questions/40480/is-java-pass-by-reference
De ce que je comprends, c'est ce qui se passe réellement:
Lorsque vous transmettez un objet dans une méthode avec java, vous êtes essentiellement en passant un pointeur vers l'objet. Ainsi, lorsque vous appelez cc.geConditionMap(), vous avez en gros le pointeur de retour. Quand vous le changez, vous n'êtes pas en train de changer l'objet. Vous faites votre copie du pointeur pointe vers une autre carte.
Votre copie du pointeur n'est pas protégé par la finale depuis que vous avez stocké le copier à un non-dernière variable.
OriginalL'auteur Gennaro De Luca
Dans "C/C++" conditions:
Le "final" en Java est plus proche de "b".
"b" est un pointeur constant d'une Chose.
"b" ne peut pas être modifié pour pointer vers un autre Chose, mais la Chose elle-même peut être modifié.
Java ne dispose pas d'une représentation de "c" et "d".
"c" est un pointeur vers une constante Chose.
"c" peut pointer vers d'autres Choses, mais les Choses que les points ne peut pas être changé (au moins, pas par "c")
"d" combine "b" et "c": "d" est un pointeur constant Chose de constant.
Oh, et "a" est bien sûr juste rien de spécial.
Hm...En Java, tout n'est pas un objet de sorte que les règles sont un peu différentes.
Qui, dans C est un peu comme
Qui signifie que vous ne pouvez pas modifier "f" ou sa valeur entière.
REMARQUE:
les deux signifient la même chose, mais avec un "f" à mon humble avis a plus claire de la signification.
"g" est malheureusement très fréquent.
OriginalL'auteur joeking
Ce sont les usages du mot-clé final que je sais:
Dans la déclaration de classe
Cela signifie que la classe: ne peut pas être sous-classé
Dans une variable globale
Cela signifie qu'une fois qu'une valeur est affectée, il ne peut pas changer.
Il y aura une erreur de compilation si vous n'affectez pas la valeur, mais ce que vous pouvez faire est d'utiliser la composition de donner une valeur.
Dans un paramètre de l'objet
Cela signifie que l'objet passé ne peut être changé
Dans des variables locales
Cela signifie que la valeur ne peut pas changer une fois attribué
Dans les méthodes
Cela signifie que la méthode ne peut pas être remplacée
Dans les collections & cartes
Cela signifie que la collection ne peut pas être réinitialisé, mais cela ne veut pas dire que les éléments sont inmutable, chacun des éléments qui ne seront pas afected par le mot-clé
final
OriginalL'auteur sfrj
Lorsqu'une référence est définitive, il ne peut être lié à n'importe quel autre objet.
Les valeurs de l'objet peut être modifié, de sorte que vous pouvez ajouter des valeurs à la carte, mais ne peut pas changer l'objet de la carte.
OriginalL'auteur richa_v
Disons,
Carte finale map = new HashMap();
nouveau : est responsable de la création de l'objet dans le tas qui détient la valeur
"carte" de référence sera créé dans la pile, qui est définitive.
importer java.util.HashMap;
importer java.util.Carte;
public class FinalExample {
public static void main(String[] args) {
}
classe Final1 {
final int a = 10;
}
classe Final2 {
final static Map map = new HashMap();
}
OriginalL'auteur Nandeshwar
Remarque:- Lorsque vous déclarez un objet de référence final, cela signifie qu'il va toujours pointer vers le même objet sur le tas, à qui il a été initialisé.
1.) Java est de passer par valeur, de sorte que lorsque vous écrivez
cc.setConditionMap(cacheMap
) oùcacheMap
est une référence d'objet (Remarque:-cacheMap
n'est pas un objet en soi, c'est juste une référence), alors vous êtes juste de passage à l'adresse de l'objet sur le tas àsetConditionMap(cacheMap)
, maintenant à l'intérieursetConditionMap(cacheMap)
,conditionMap
est initialisé avec la valeur decacheMap
(la valeur de la Carte mémoire cache est l'adresse de l'Objet Map). Maintenant, après cette étape, les deuxconditionMap
etcacheMap
se réfère au même objet sur le tas. Mais le hic, c'est que vous pouvez définir la valeur deconditionMap
de sorte qu'il pointe vers quelque autre objet map sur le tas, maiscacheMap
toujours pointer vers le même Objet Map.2.) La déclaration d'une variable final ne signifie pas que l'objet sur le tas est définitive(n'a pas de sens du tout, pas vrai?) au lieu de ce que cela signifie, c'est que la variable de toujours pointer vers l'objet pour lequel il a été initialisé et personne ne peut le changer.
OriginalL'auteur light