Bonjour,
quelle sont les differents possibilité (en java) pour instancier un objet par exemple un objet de la classe JButton ou la classe String.
merci pour la réponse
A+;)
Version imprimable
Bonjour,
quelle sont les differents possibilité (en java) pour instancier un objet par exemple un objet de la classe JButton ou la classe String.
merci pour la réponse
A+;)
Bonsoir,
Vague? Je dit que c'est plus que ça, l'instanciation d'un objet se trouve toujours sur la première partie d'un tutoriel Java.
Tu peux utiliser new, créer directement à partir de ses valeurs (ex: String, tableau, ...), utiliser la méthode forName de Class aussi.
Bref, :fleche: :google:
A+.
J'attire votre attention sur la classe String. L'instanciation d'objets de cette classe et la gestion en mémoire de ceux-ci sont différentes de tout autre classe.
Un objet String est non modifiable (immuable). Je parle de l'objet et non pas de sa référence. Si vous allez consulter cette classe, vous verrez qu'elle est marquée "final".
Ce qui est équivalant à String s = new String("abc");Code:String s = "abc";
Mais Java permet de raccourcir l'instanciation de cette classe.
Pour le moment nous avons 1 variable référence s et 1 objet String en mémoire ayant pour valeur "abc"
Nous avons maintenant 2 variables références s et s2 et toujours 1 objet en mémoire ayant pour valeur "abc".Code:String s2 = s;
Pour le moment, il y a pas de différence avec l'instanciation d'objet de classe "classique".
Voyons l'étape suivante :
Comme l'objet String "abc" n'est pas modifiable, un autre objet String "abcdef" est créé.Code:s = s.concat("def");
Et les variables s et s2 ne font plus référence au même objet.
Nous avons maintenant 2 variables références s et s2 et 2 objets String, "abc" et "abcdef" là où une autre classe "classique" aurait modifié l'objet sans en créer un nouveau.
Pas tout-à-fait... Java fait un traitement particulier sur les chaînes littérales comme "abc" et les instancie au chargement des classes si besoin, oui...
Mais new String("abc") en instancie encore une autre. Ça fait deux chaînes et non pas une :
- la chaîne "abc" qui a été instanciée au chargement parce que c'est une chaîne littérale
- la chaîne qui a été instanciée par l'appel du constructeur new String().
Ce n'est pas équivalent, et ce n'est pas un raccourci. L'appel de new String() n'est pas utile, mais si on le fait, ça fait bel et bien quelque chose de nouveau.
Le final n'a aucun rapport avec l'immuabilité des String. Le final sur une classe indique juste que cette classe ne peut pas être héritée.
En faite il y a quand même un rapport. Si String pouvais être héritée, alors on pourrai écrire :
==> salutCode:
1
2
3
4
5 String s1 = new StringPerso("hello") String s2 = s1; s2.replaceAll("hello", "salut");// replaceAll est redéfinie pour modifier le contenu du tableau de char représentant la chaine (private final char value[];). System.out.println(s1);
Bon il est possible de faire ce genre de "connerie" en utilisant la reflexion (setAccessible(true) sur le field value). Mais à partir du moment où on touche à ça, on doit savoir ce que l'on fait...