Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage Java > initialisation en Java > Lecture du sujet

initialisation en Java

initialisation implicite....

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne Shenzhu # Posté le 04/10/2008 à 15:37:32
Avatar
Groupe : Membres

"La création d'un objet entraine toujours, par ordre chronologique, les operations suivantes:
-initialisation par défaut de tous les champs de l'objet(initialisation implicite)
-initialisation explicite lors de la déclaration du champ
-exécution du corps du constructeur
[...]
[l'intialisation implicite correspond à] une initialisation à une valeur par défaut "nulle"..."
source Programmer en Java de Claude Delannoy


que se passe-t-il lors de la compilation de la classe ci-dessous ?

classe B
{....
private int p = n+2;
private int n = 10;
private final int m;
}

lorsqu'on créé un objet, tous les champs sont initialisé par défaut à une valeur nulle, alors, p=0, m=0 et n=0. Mais pourquoi y a-t-il erreur de compilation, si n contient deja une valeur ?

d'autre part, pourquoi est-ce qu'il y a erreur avec la variable m declaree final si dans le constructeur on ne lui attribut pas de valeur ? elle a deja la valeur 0 non ?

finalement, à quoi sert cette fameuse initialisation par défaut ? Un travail superflux ? les donnees ne sont pas utilisables, meme initialisees (par defaut)

Rwendy
 
Hors ligne shakhal # Posté le 04/10/2008 à 15:44:53
Groupe : Membres
La lecture des attributs se fait séquentiellement, tu dois absolument initialiser n avant de l'utiliser c'est logique.

Les attributs finaux doivent être initialisés EXPLICITEMENT, soit directement à la déclaration soit dans tous les constructeurs de la classe.
Hors ligne Tarfaa # Posté le 04/10/2008 à 15:49:57
lunatique
Avatar
Groupe : Membres
hello !

Dans ton exemple, tu remplaces l'initialisation par défaut par la tienne (tu initialises en même temps que la déclaration). Et attention, l'initialisation par défaut "null" n'est pas "0" !!! Ce n'est absolument pas la même chose. Par exemple la déclaration d'une variable string l'initialise à "null" et ne met pas une chaîne ""0"".

Citation : Claude Delannoy
[l'intialisation implicite correspond à] une initialisation à une valeur par défaut "nulle"..."

Ici il veut bien parler de "null" et non de "0". En effet "0" ne peut de toute façon que s'appliquer à un entier.
Hors ligne Shenzhu # Posté le 06/10/2008 à 22:10:17
Avatar
Groupe : Membres
quelle est finalement l'importance de l'initialisation par défaut ?

je sais que l'initialisation par défaut ne veut pas dire par "0", c'est pourquoi nulle est entre guillemets dans la phrase "[l'initialisation implicite correspond à] une initialisation à une valeur par défaut "nulle"..."

mais, comme il s'agit ici de int les variables sont initialisées à 0...

Mon problème, c'est que cette initialisation par défaut est superflue, vue que finalement, l'initialisation à 0 de n n'est pas tout à fait réelle...

Rwendy
 
Hors ligne QuentinC 2 # Posté le 06/10/2008 à 22:31:45
Étudiant qui bosse ... ou pas
Groupe : Membres
Citation
d'autre part, pourquoi est-ce qu'il y a erreur avec la variable m declaree final si dans le constructeur on ne lui attribut pas de valeur ? elle a deja
la valeur 0 non ?

Une variable déclarée finale est un peu particulière : une fois qu'elle a reçu une valeur, on ne peut plus la changer. Ca, tu savais, je pense.
Le constructeur est la seule "méthode" qui n'est appelée à coup sûr qu'une seule fois dans la vie de
Donc, on peut sans crainte attribuer une valeur à la variable puisque on est sûr qu'elle ne sera jamais modifiée.
En revanche on ne peut pas lui attribuer une valeur dans une autre méthode. Pourquoi, eh bien parce qu'il est impossible de savoir si elle a déjà reçu une valeur ou non lors de l'instruction d'affectation. Comme une réaffectation est interdite, le compilateur refuse.
Maintenant, avant que tu ne lui donnes sa valeur, ta variable est dans un état indéterminé. C'est dangereux, parce que c'est absolument imprévisible.
En Java, on ne préfère pas se fier à ce genre d'imprécisions. Compte tenu de la remarque précédente, le constructeur est le dernier moment où on peut initialiser une variable final, et on doit le faire dans tous les constructeurs si on en a plusieurs, car la valeur doit être fixe dans tous les cas.

Notons toutefois que dans certains langages comme le C, on autorise cette imprécision : en C on peut déclarer une variable non initialisée et c'est valide.

Citation
finalement, à quoi sert cette fameuse initialisation par défaut ? Un travail superflux ? les donnees ne sont pas utilisables, meme initialisees (par defaut)

C'est une sécurité, de nouveau, pour éviter que les variables contiennent des valeurs arbitraires. En pratique on ne devrait jamais se fier à ce mécanisme, il faudrait toujours assigner une valeur explicitement soit dans le constructeur soit à la déclaration, même si c'est null, 0 ou false.

java.lang.BrainNotFoundException : neuron connection failure

Javascript, php, html, jeux, blagues, etc. == http://quentinc.net/
 
Hors ligne Duarna # Posté le 06/10/2008 à 22:34:46
Avatar
Groupe : Membres
Dans ton exemple, n n'est même pas déclarée au moment ou tu l'utilises. Elle risque donc pas d'être initialisée, vu que l'initialisation se fait à la déclaration. Enfin je pense...
Hors ligne shakhal # Posté le 07/10/2008 à 18:59:42
Groupe : Membres
Citation : Shenzhu
l'initialisation à 0 de n n'est pas tout à fait réelle


En effet vu que tu déclares 'n' APRES, tu peux pas remplir un verre d'eau si tu n'as pas sorti le verre de l'armoire.

Y a un ordre pour faire les choses.
Édité le 07/10/2008 à 19:00:17 par shakhal
Hors ligne Floooder # Posté le 07/10/2008 à 19:48:31
Groupe : Membres
Pour comparer, il suffit de prendre le C ou il n'y a pas d'initalisation par defaut.

Si en C tu fais int n; afficher(n); la valeur de n serra differente et aleatoire a chaque execution du programme. En java le même code affichera toujours 0
Hors ligne QuentinC 2 # Posté le 07/10/2008 à 22:07:10
Étudiant qui bosse ... ou pas
Groupe : Membres
Citation
Si en C tu fais int n; afficher(n); la valeur de n serra differente et aleatoire a chaque execution du programme. En java le même code affichera toujours
0

Dans certains cas ça va même plus loin : le compilateur répond "Variable n might not be initialized".  

java.lang.BrainNotFoundException : neuron connection failure

Javascript, php, html, jeux, blagues, etc. == http://quentinc.net/
 
Hors ligne Floooder # Posté le 08/10/2008 à 04:26:54
Groupe : Membres
Citation
Mon problème, c'est que cette initialisation par défaut est superflue, vue que finalement, l'initialisation à 0 de n n'est pas tout à fait réelle...


Attention à ne pas confondre initialisation et déclaration ;)

declaration : J'utilise une variable, garde moi une place en memoire pour la ranger
initialisation : Met la variable a x pour commencer
Hors ligne Shenzhu # Posté le 09/10/2008 à 21:39:38
Avatar
Groupe : Membres
si j'avais bien compris ce que le livre de Mr Delannoy disait, toutes les variables sont initialisées par défaut à une valeur nulle... Donc au départ, la valeur correspondant à n est 0 de même que celle de p....

donc, il ne devrait pas y avoir d'ambiguité lorsqu'on arrive à l'initialisation implicite: n a une valeur (n=0).... donc arrivé à la ligne sur l'affectation de valeur de p, c'est à dire p=n+2, p devrait à priori recevoir la valeur 0+2.

Que se passe-il dans une déclaration de variable ? Si je ne me trompe pas, l'ordinateur réserve de l'emplacement mémoire pour la variable et en fonction de celle ci.

Pendant l'initialisation par défaut, l'ordinateur sait que n est un int et non un objet, c'est pour quoi, elle initialise n à 0 et non à null... mais le fait d'attribuer une valeur à n dans cette initialisation par défaut ne correspond-elle pas à une réservation d'un emplacement de mémoire pour n ? Meme si cela se passe avant la déclaration...

Peut etre que c'est moi qui ne sait pas ce qui se passe pendant une declaration o_O .... Quelle difference y a-il alors entre ce qui se passe pendant l'initialisation par défaut(implicite), et l'initialisation explicite (avec déclaration de variable et tout) ?

Rwendy
 
Hors ligne Johnny00pi00 # Posté le 09/10/2008 à 22:07:44
Groupe : Membres
je crois que le problème c'est que ton n n'a pas la valeur 0 puisqu'il n'existe pas encore , il a la valeur seulement si tu fais ta déclaration de variable sans l'initialiser.
Hors ligne shakhal # Posté le 09/10/2008 à 22:12:27
Groupe : Membres
Citation

Dans certains cas ça va même plus loin : le compilateur répond "Variable n might not be initialized".  


L'initialisation par défaut ne marche que pour les variables d'instances non finales.
Dans une méthode, si tu crées une variable, tu dois l'initialiser explicitement avant de t'en servir.
Hors ligne quarante-sept # Posté le 11/10/2008 à 23:09:52
Roi des marmottes
Avatar
Groupe : Membres
salut tout le monde.

Pour précision :
L'initialisation simplicite ne se passe pas à la déclaration. En fait, les propriétés ne sont initialisés implicitement que si on ne leur a pas attribué de valeur apres la création de l'instance, c'est à dire apres la fin du constructeur.

Sinon si vous déclarez une variable locale à une méthode, vous DEVEZ l'initialiser explicitement, sans quoi vous aurez une erreur de compilation.

voilà ;)

Image utilisateur
Image utilisateur
Image utilisateur
 

Retour au forum "Langage Java" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 440 Zéros connectés | Requêtes SQL 9 requêtes | Temps de génération de la page : Total (SQL) 0.0424s (0.0221s)