Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1917 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Auteur Sujet :

A propos des inner class, et des inner class statiques

n°199144
benou
Posté le 21-08-2002 à 18:56:44  profilanswer
 

Reprise du message précédent :

- Renaud - a écrit a écrit :

 
pour etre plus precis, c'est sans instanciation de la outer classe




bha merde, tu me mets dans le doute maintenant :cry:
 
bon, je vais aller me documenter, je reviens plus tard.

mood
Publicité
Posté le 21-08-2002 à 18:56:44  profilanswer
 

n°199147
bobuse
Posté le 21-08-2002 à 19:03:37  profilanswer
 

benou a écrit a écrit :

 
bha merde, tu me mets dans le doute maintenant :cry:
 
bon, je vais aller me documenter, je reviens plus tard.




Mais non, c'est bon, c'est ça !
une inner class static, ça signifie que tu peux l'instancier (ou t'en servir de manière générale) sans instancier la outer classe.
heu là, je répète ce qu'a déjà dit Renaud ... ;)

n°199148
benou
Posté le 21-08-2002 à 19:05:03  profilanswer
 

bon je viens de looker le source de la class HashMap et c'est bien ce que je pensais : dans la HashMap, il y a des instantiation de la static inner class Entry à tour de bras !
y a pas d'auto-allocation ou quoi que ce soit dans le genre !

n°199150
benou
Posté le 21-08-2002 à 19:06:51  profilanswer
 

bobuse a écrit a écrit :

 
Mais non, c'est bon, c'est ça !
une inner class static, ça signifie que tu peux l'instancier (ou t'en servir de manière générale) sans instancier la outer classe.
heu là, je répète ce qu'a déjà dit Renaud ... ;)  




ben oui, mais là j'ai compris. :)
 
bref, l'ami therier se plantait ...

n°199151
- Renaud -
Posté le 21-08-2002 à 19:07:27  profilanswer
 

benou a écrit a écrit :

bon je viens de looker le source de la class HashMap et c'est bien ce que je pensais : dans la HashMap, il y a des instantiation de la static inner class Entry à tour de bras !
y a pas d'auto-allocation ou quoi que ce soit dans le genre !




 
non, pas d'autoallocation ca je suis d'accord

n°199152
therier
heu...coucou!
Posté le 21-08-2002 à 19:07:30  profilanswer
 

bobuse a écrit a écrit :

 
Mais non, c'est bon, c'est ça !
une inner class static, ça signifie que tu peux l'instancier (ou t'en servir de manière générale) sans instancier la outer classe.
heu là, je répète ce qu'a déjà dit Renaud ... ;)  




 

Code :
  1. Un p'tit example en 2 fichiers:
  2. package toto;
  3. public class Rigolo {
  4.   public static class Coucou{
  5.       static String valeur = "Ben tu vois!";
  6.   }
  7. }


 
et pour lancer tout ça:
 

Code :
  1. package toto;
  2. public class Example {
  3.   Example(){
  4.    System.out.println( Rigolo.Coucou.valeur );
  5.   }
  6.   public static void main(String[] args) {
  7.     new Example();
  8.   }
  9. }


 
Je sais pas si ça aide...
 
 
 
 


---------------
XBox? http://www.gamertagdatabase.com
n°199154
- Renaud -
Posté le 21-08-2002 à 19:09:46  profilanswer
 

therier a écrit a écrit :

 
 
Un p'tit example en 2 fichiers:
 




 
C'est pas de l'autoallocation ca, c'est l'acces a des champs statiques, et pas besoin d'instance pour ca.

n°199155
benou
Posté le 21-08-2002 à 19:11:15  profilanswer
 

ben non ca change rien. Bien sur que l'attribut peut être accéder puisqu'il est static... ca ne fait pas avancer le chmilblique ...

n°199157
benou
Posté le 21-08-2002 à 19:11:28  profilanswer
 

grilled :(

n°199158
bobuse
Posté le 21-08-2002 à 19:11:49  profilanswer
 

therier a écrit a écrit :

 
Je sais pas si ça aide...




 
Ben pas tellement ...
Ca démontre une utilité d'une variable statique. (Le reste ayant déjà été démontré et expliqué plus haut)

mood
Publicité
Posté le 21-08-2002 à 19:11:49  profilanswer
 

n°199159
bobuse
Posté le 21-08-2002 à 19:12:29  profilanswer
 

benou a écrit a écrit :

grilled :(




2x

n°199162
benou
Posté le 21-08-2002 à 19:17:08  profilanswer
 

Code :
  1. public class Rigolo {
  2. public static class Coucou{
  3.      public Coucou() {
  4.          System.out.println("Ben tu vois!" );
  5.      }
  6. }
  7. public static void main(String[] args) {
  8.     System.out.println("debut" );
  9.     new Rigolo ();
  10.     System.out.println("apres new Rigolo()" );
  11.     // si Coucou était auto-instancié, ca dervait afficher  
  12.     // "Ben tu vois!" , mais ca affiche rien.
  13.    Rigolo.Coucou c1 = new Rigolo.Coucou(); // affiche
  14.    Rigolo.Coucou c2 = new Rigolo.Coucou(); // affiche
  15.    Rigolo.Coucou c3 = new Rigolo.Coucou(); // affiche
  16.    Rigolo.Coucou c4 = new Rigolo.Coucou(); // affiche
  17.    // juste histoire de montre que tu peux  
  18.    // en créer tant que tu veux ...
  19. }
  20. }

n°199165
therier
heu...coucou!
Posté le 21-08-2002 à 19:24:37  profilanswer
 

- Renaud - a écrit a écrit :

 
 
C'est pas de l'autoallocation ca, c'est l'acces a des champs statiques, et pas besoin d'instance pour ca.




 
Les champs statiques, ils naissent dans les choux fleurs?  :D  
 
C'est la JVM qui "les alloue" Bon ok, l'exemple est à 2 boules...
 :D  
 
De toutes façon, il y a tres peu d'interet de creer des inner classes statiques...pour avoir un "joli nommage" comme ils font pour Point2D.Float, c vrai c bien...  :D  
 
 
Allez, sur ce bye et voila l'exemple à 30 centimes d'? "à la JDK":
 

Code :
  1. package toto;
  2. public class Example {
  3.   Example(){
  4.    System.out.println( new Rigolo.Amateur().nom() );
  5.   }
  6.   public static void main(String[] args) {
  7.     new Example();
  8.   }
  9. }


 
 
et pis:
 

Code :
  1. package toto;
  2. public abstract class Rigolo {
  3.   public abstract String nom();
  4.   public static class Amateur extends Rigolo{
  5.       public String nom() {return  "Moi!!!";}
  6.   }
  7. }


---------------
XBox? http://www.gamertagdatabase.com
n°199166
therier
heu...coucou!
Posté le 21-08-2002 à 19:25:46  profilanswer
 

benou a écrit a écrit :

Code :
  1. public class Rigolo {
  2. public static class Coucou{
  3.      public Coucou() {
  4.          System.out.println("Ben tu vois!" );
  5.      }
  6. }
  7. public static void main(String[] args) {
  8.     System.out.println("debut" );
  9.     new Rigolo ();
  10.     System.out.println("apres new Rigolo()" );
  11.     // si Coucou était auto-instancié, ca dervait afficher  
  12.     // "Ben tu vois!" , mais ca affiche rien.
  13.    Rigolo.Coucou c1 = new Rigolo.Coucou(); // affiche
  14.    Rigolo.Coucou c2 = new Rigolo.Coucou(); // affiche
  15.    Rigolo.Coucou c3 = new Rigolo.Coucou(); // affiche
  16.    Rigolo.Coucou c4 = new Rigolo.Coucou(); // affiche
  17.    // juste histoire de montre que tu peux  
  18.    // en créer tant que tu veux ...
  19. }
  20. }






 
ben oui tu peux! static ça veut pas dire : "interdit de creer des instances" !!!
Ca veut dire "alloué statiquement" et pas dynamiquement!
 


---------------
XBox? http://www.gamertagdatabase.com
n°199167
- Renaud -
Posté le 21-08-2002 à 19:26:28  profilanswer
 

benou a écrit a écrit :

[cpp]  
   // juste histoire de montre que tu peux  
   // en créer tant que tu veux ...




 
le static ne fait pas reference a l'unicite de l'instance, mais de la classe
 
a une inner classe static est associee une unique instance de Class (l'object java): le code est partage' dans toute la JVM
 
a une inner classe non static est associee une instance de Class par instance de la outer classe: le code est duplique autant de fois que d'instances de la outer classe.
 
que la inner classe soit statique ou non, n'a aucune influence sur le nombre d'instances que l'on peut creer comme le porouve ton example

n°199168
therier
heu...coucou!
Posté le 21-08-2002 à 19:30:03  profilanswer
 

therier a écrit a écrit :

 
 
ben oui tu peux! static ça veut pas dire : "interdit de creer des instances" !!!
Ca veut dire "alloué statiquement" et pas dynamiquement!
 




 
...je me complète, ça pourrais être mal interprété...
 
Mais tu PEUX en créer des instances si tu veux. Si tu n'as pas d'object statiques dans cette classe, RIEN ne sera crée avant que tu ai fait une instance.
 
 
 
Bon aprés la feinte de le mettre dans une autre classe, c'est pour faire joli...
 
 
Le problême c'est que de mettre une statique dans une publique ça joue sur la portée de la statique, du fait que tu n'ai pas a instancier la publique pour acceder à la statique.
 
(Plus on essaie de s'expliquer, moins on est clair!)  :D  
ciao!  :hello:  
 
 [:therier]


---------------
XBox? http://www.gamertagdatabase.com
n°199171
therier
heu...coucou!
Posté le 21-08-2002 à 19:31:51  profilanswer
 

- Renaud - a écrit a écrit :

 
 
le static ne fait pas reference a l'unicite de l'instance, mais de la classe
 
a une inner classe static est associee une unique instance de Class (l'object java): le code est partage' dans toute la JVM
 
a une inner classe non static est associee une instance de Class par instance de la outer classe: le code est duplique autant de fois que d'instances de la outer classe.
 
que la inner classe soit statique ou non, n'a aucune influence sur le nombre d'instances que l'on peut creer comme le porouve ton example




 
Wahou!! Quand tu parles, je te comprends alors que j'ai même tu mal à me relire des fois!   :D  
 
 :jap:  


---------------
XBox? http://www.gamertagdatabase.com
n°199175
benou
Posté le 21-08-2002 à 19:36:38  profilanswer
 

- Renaud - a écrit a écrit :

 
a une inner classe non static est associee une instance de Class par instance de la outer classe: le code est duplique autant de fois que d'instances de la outer classe.



je comprend pas bien là ...
 
tu dis que à chaque fois qu'on créé une instance de la outer class, une nouvelle instance de la classe Class de la inner Classe est créée ? c'est bien ca ? si oui ca veut dire que c'est fait dynamiquement (à chaque new sur la outer classe) et ca me parait super-clourd !
 
quel est l'intérêt ? de toute façon toutes les instances de la inner classes correspondent au même type => à la même instance de Class.

n°199176
benou
Posté le 21-08-2002 à 19:37:19  profilanswer
 

elle devient vachement intéressante cette discussion ! :)


Message édité par benou le 21-08-2002 à 19:41:31
n°199178
darklord
You're welcome
Posté le 21-08-2002 à 19:42:52  profilanswer
 

benou a écrit a écrit :

 
tu dis que à chaque fois qu'on créé une instance de la outer class, une nouvelle instance de la classe Class de la inner Classe est créée ?



 
bin c'est logique puisque l'inner class est un membre de la outer class ...


---------------
Just because you feel good does not make you right
n°199179
- Renaud -
Posté le 21-08-2002 à 19:43:49  profilanswer
 

benou a écrit a écrit :

 
je comprend pas bien là ...
 
tu dis que à chaque fois qu'on créé une instance de la outer class, une nouvelle instance de la classe Class de la inner Classe est créée ? c'est bien ca ? si oui ca veut dire que c'est fait dynamiquement (à chaque new sur la outer classe) et ca me parait super-clourd !
 
quel est l'intérêt ? de toute façon toutes les instances de la inner classes correspondent au même type => à la même instance de Class.  




 
 
Je ne sais pas si c'est la realite, car je n'ai pas fait le test, mais il est simple:
  - tu fais une classe avec une inner class non statique
  - tu crees 2 objects avec chacun une instance de leur inner classe
  - tu fais compare ou affiche les hashcode des getClass() des 2 inner classes issues de 2 outer classes differentes
 
Qui est volontaire pour faire le test?
 
S'il se trouve que c'est le meme c'est que Sun a du trouver lourd de dupliquer le code et cela expliquerait pourquoi on ne peut pas avoir de champs statiques dans une inner classe non statique (lourdeur versus modele unifie';)
 
Renaud

n°199187
--greg--
Posté le 21-08-2002 à 19:57:29  profilanswer
 

qqun peut faire un résumé ? [:dawa]


Message édité par --greg-- le 21-08-2002 à 19:57:39
n°199189
- Renaud -
Posté le 21-08-2002 à 19:59:37  profilanswer
 

--greg-- a écrit a écrit :

qqun peut faire un résumé ? [:dawa]




 
resume': benou se moque de therier.

n°199195
--greg--
Posté le 21-08-2002 à 20:02:28  profilanswer
 

- Renaud - a écrit a écrit :

 
 
resume': benou se moque de therier.



je voulais dire un résumé des inner classes et tout ce qu'on peut / peut pas en faire et tout le toutim

n°199202
- Renaud -
Posté le 21-08-2002 à 20:06:51  profilanswer
 

inner classe statique:  
  - ne permet d'acceder qu'aux attributs / methodes statiques de la outer classe (meme private)  
  - peut etre instancier n'importe ou  
  - pourrait etre mis dans un fichier a part (si ce n'est pour l'acces aux champs private)  
  - utilisee surtout pour des outils specifiques a la classe
  - n'est pas vraiment liee a la outer classe
  - on peut creer autant d'instances que l'on veut
 
 
inner classes non statiques:  
  - permet d'acceder a toute la outer classe  
  - ne peut etre instancier qu'a partir d'une instance de la classe  
  - ne pourrait pas etre mis dans un fichier a part (sauf modification structurelle)  
  - utilisee surtout pour des outils specifiques a l'instance  
  - 1 Object Class par instance (a verifier)
  - on peut creer autant d'instances que l'on veut
  - pas de champs statiques
 

n°199266
LeGreg
Posté le 21-08-2002 à 22:25:06  profilanswer
 

wow ! mais c'est impressionnant cette discussion..
 
LeGreg

n°199294
therier
heu...coucou!
Posté le 21-08-2002 à 23:03:15  profilanswer
 

0

- Renaud - a écrit a écrit :

 
 
resume': benou se moque de therier.



n°199295
therier
heu...coucou!
Posté le 21-08-2002 à 23:04:10  profilanswer
 

- Renaud - a écrit a écrit :

 
 
resume': benou se moque de therier.




 
Salaud!  :D  
 
Bon, au moins, moi, j'ai compris  :D  

n°199372
benou
Posté le 22-08-2002 à 00:09:08  profilanswer
 

- Renaud - a écrit a écrit :

 
resume': benou se moque de therier.




c'est pas vrai ! je me suis pas moqué !
 
c'est juste que j'aime pas quand quelqu'un affirme quelque chose sans savoir : on est sur un forum ici, le but c'est pas de diffuser des fausses idées !

n°199374
benou
Posté le 22-08-2002 à 00:10:25  profilanswer
 

DarkLord a écrit a écrit :

 
bin c'est logique puisque l'inner class est un membre de la outer class ...




je vois pas en quoi c'est logique de créer une nouvelle instance de la class Class à chaque fois : Class ca fonctionne sur le mode singleton en principe ...

n°199415
- Renaud -
Posté le 22-08-2002 à 00:51:57  profilanswer
 

benou a écrit a écrit :

 
je vois pas en quoi c'est logique de créer une nouvelle instance de la class Class à chaque fois : Class ca fonctionne sur le mode singleton en principe ...




 
/!\  noob passe ton chemin...  :pt1cable:  :pt1cable:  
 
ben a ce niveau la c'est pas tres clair
a mon avis la logique aurait voulu que l'on ai une nouvelle instance a chaque fois, car dans un contexte (outer instance) different et donc des attributs statiques specifiques a chaque instance
 
Cependant, au niveau de l'implem, ca devait etre trop lourd, donc Sun a decide' de n'avoir qu'un seul object Class meme dans le cas d'inner classes non statiques.
 
Ce qui me fait dire que c'est peut etre la foacon dont ont evolue les choses, est le fait de ne pas avoir droit aux statiques dans une inner classe non statique :
   --> en effet,  si on estime naturel que l'inner classe non statique soit partagee, alors il ne devrait y avoir aucune raison a interdire les champs statiques
   --> si l'inner classe non statique ne devait pas etre partagee, et qu'elle l'est a cause de l'implementation, alors les champs statiques posent un probleme, qui se resout en les interdissant.
 
 
Renaud

n°199457
El_gringo
Posté le 22-08-2002 à 08:54:34  profilanswer
 

Ha, donc finalement, j'avais raison qd j'disais ça:

Citation :

J'imagine qu'une inner class statique, c'est une inner class publique (sinon ça n'a pas de sens), qu'on peut instancier, sans avoir d'instance de la classe dans laquelle elle est contenue. c ça ?


 
 non !?

n°199458
darklord
You're welcome
Posté le 22-08-2002 à 08:58:02  profilanswer
 

El_Gringo a écrit a écrit :

Ha, donc finalement, j'avais raison qd j'disais ça:

Citation :

J'imagine qu'une inner class statique, c'est une inner class publique (sinon ça n'a pas de sens), qu'on peut instancier, sans avoir d'instance de la classe dans laquelle elle est contenue. c ça ?


 
 non !?




 
j'ai trouvé un résumé à propos de tout ca
 
http://java.sun.com/docs/books/tut [...] swers.html

n°199495
therier
heu...coucou!
Posté le 22-08-2002 à 09:33:02  profilanswer
 

benou a écrit a écrit :

 
c'est pas vrai ! je me suis pas moqué !
 
c'est juste que j'aime pas quand quelqu'un affirme quelque chose sans savoir : on est sur un forum ici, le but c'est pas de diffuser des fausses idées !




 
heu.... :)  
 


---------------
XBox? http://www.gamertagdatabase.com
n°199504
therier
heu...coucou!
Posté le 22-08-2002 à 09:44:09  profilanswer
 

- Renaud - a écrit a écrit :

 
 
ben a ce niveau la c'est pas tres clair
a mon avis la logique aurait voulu que l'on ai une nouvelle instance a chaque fois, car dans un contexte (outer instance) different et donc des attributs statiques specifiques a chaque instance
 
Ce qui me fait dire que c'est peut etre la foacon dont ont evolue les choses, est le fait de ne pas avoir droit aux statiques dans une inner classe non statique :
   --> en effet,  si on estime naturel que l'inner classe non statique soit partagee, alors il ne devrait y avoir aucune raison a interdire les champs statiques
   --> si l'inner classe non statique ne devait pas etre partagee, et qu'elle l'est a cause de l'implementation, alors les champs statiques posent un probleme, qui se resout en les interdissant.
 




 
Je pense que c'est plus simple que ça.
 
On part sur une outer non statique (et publique).
 
si ton inner est statique, la jvm va reserver statiquement au lancement de la place mémoire pour cette classe. Si tu as un champ statique dedans, la jvm allouera aussi de la place pour ce champ.
 
si ton inner n'est pas statique, la jvm ne reserve pas de place, alors, que devient le membre statique censé être alloué au demarrage? Ben c'est dur de l'allouer du coup... puisqu'il n'est pas censé exister  :pt1cable:  
 
Je sais pas si je suis clair...[:miracle]  
 
 
 
 
 


---------------
XBox? http://www.gamertagdatabase.com
n°199588
El_gringo
Posté le 22-08-2002 à 10:57:25  profilanswer
 

therier a écrit a écrit :

 
 
Je pense que c'est plus simple que ça.
 
On part sur une outer non statique (et publique).
 
si ton inner est statique, la jvm va reserver statiquement au lancement de la place mémoire pour cette classe. Si tu as un champ statique dedans, la jvm allouera aussi de la place pour ce champ.
 
si ton inner n'est pas statique, la jvm ne reserve pas de place, alors, que devient le membre statique censé être alloué au demarrage? Ben c'est dur de l'allouer du coup... puisqu'il n'est pas censé exister  :pt1cable:  
 
Je sais pas si je suis clair...[:miracle]  




 
...Tu t'es lamentablement planté, tu t'est même pas excusé d'avoir mis du monde en erreur.
Je pense qu'il y a un moment ou il faut savoir se faire petit !

n°199591
darklord
You're welcome
Posté le 22-08-2002 à 10:59:56  profilanswer
 

:heink:

n°199598
therier
heu...coucou!
Posté le 22-08-2002 à 11:07:41  profilanswer
 

El_Gringo a écrit a écrit :

 
 
...Tu t'es lamentablement planté, tu t'est même pas excusé d'avoir mis du monde en erreur.
Je pense qu'il y a un moment ou il faut savoir se faire petit !




 
Gros Blaireau!  :fou:  t'as raison t'es le roi et je suis un gland!  :heink:  
 
Tchao grande lumière intersidérale!
 
 
 


---------------
XBox? http://www.gamertagdatabase.com
n°199607
--greg--
Posté le 22-08-2002 à 11:13:16  profilanswer
 

[:fear]

n°199609
darklord
You're welcome
Posté le 22-08-2002 à 11:13:50  profilanswer
 

gringo t'as pêté un plomb ou quoi?

n°199620
bobuse
Posté le 22-08-2002 à 11:19:03  profilanswer
 

Heu comment on fait pour verrouiller un topic ? :sarcastic:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4

Aller à :
Ajouter une réponse
 

Sujets relatifs
truc de fou : j'ai fait une class qui fait monter mon CPU à 90° !A propos de la taille des cellules dans un tableau
[VBS] Prob class introuvable Win32_DesktopMonitor[java] A propos des applets swing
[HTML] cellpadding ok, nouvelle question : lier les class ?a propos des menus dans les sites web
[CSS] les class, variable local ou global??[ CSS ] comment defini une class avec une taille de police
[css] pb avec les class et les balise A[VC++] A propos d'une CPropertySheet
Plus de sujets relatifs à : A propos des inner class, et des inner class statiques


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)