Définition de "instance" an JAVA

Résolu/Fermé
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 - 5 janv. 2013 à 14:36
primel56 Messages postés 16 Date d'inscription samedi 14 janvier 2012 Statut Membre Dernière intervention 10 décembre 2013 - 10 déc. 2013 à 18:45
Bonjour,

Je suis débutant dans le langage JAVA et je cherche quelque éclaircissement.

Je n'arrive pas à assimilé la définition de "instance" où plutôt je ne suis pas sur de comprendre complètement son sens.

Je pense:

En faite l'on souhaite utiliser une classe (exemple: Fenetre), mais vue que dans notre programme il faut l'utiliser plusieurs fois cette classe, pour pouvoir avoir plusieurs Fenetre il faut lui donner un (ou des) nom (exemple: fen1, fen2, fen3,...) pour au final pouvoir utiliser chaque nom là ou nous souhaitons utiliser la classe Fenetre,
Mais en gros ça ne ressemble pas à faire un héritage de la classe Fenetre sur le nom fen1 ou fen2 ou fen3 ...??????? car dans les deux cas nous souhaitons utiliser une même classe (Fenetre) plusieurs fois dans notre programme mais en lui attribuant à chaque fois des paramètre différent.

L'instance permet de "réserver" ou "d'attribuer" un nom, qui lui, fait référence à une classe.
C'est bien ça?

Éclairé moi !!! Merci d'avance pour vos réponses et votre aide.
A voir également:

4 réponses

KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 015
5 janv. 2013 à 15:39
L'instance d'une classe c'est un objet.

La classe est un peu comme un "moule à gâteaux", tu peux t'en servir plusieurs fois avec des paramètres différents (différentes pâtes à gâteaux), pour obtenir plusieurs gâteaux différents issus du même moule.

En Java les objets les plus courants que l'on utilise ce sont les String.

String s1 = new String("bonjour");
String s2 = new String("ça va ?");

Ici on a créé deux objets différents de la même classe String. Ces objets sont manipulés par deux variables (s1 et s2) sur lesquels on peut appliquer des méthodes dont le comportement dépendra de leur état (de leur valeur).

En revanche l'héritage copie une classe pour l'enrichir, c'est à dire qu'on rajoute des méthodes supplémentaires pour manipuler des objets de plus en plus particuliers.

Si tu as trois fenêtres de la même classe, elles auront toutes un comportement identiques (avec des variations sur leur paramètres). En revanche si tu considères une fenêtre d'une classe héritée, celle-ci pourra utiliser toutes les méthodes d'une fenêtre normale, mais aura en plus des méthodes qui lui est propre ce qui permettra d'avoir un comportement spécifique à sa classe.
7
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
Modifié par Pulsar360 le 5/01/2013 à 16:25
Merci beaucoup pour ton aide =)

Donc

String s1 = new String("bonjour");
String s2 = new String("ça va ?");

... sur lesquels on peut appliquer des méthodes dont le comportement dépendra de leur état (de leur valeur).
...
En revanche l'héritage copie une classe pour l'enrichir...

La je ne comprend pas, car sur une classe hérité on peut tous à fait appliquer de nouvelle méthode sur les objets de la classe fille, tous comme une instance de la dite même classe nous pourrions modifier ou appliquer de nouvelle méthode, non?

De plus, est ce que c'est deux annotations sont identiques?

String s1 = new String("bonjour");
String s2 = new String("ça va ?");
et
String s1 = "bonjour" , s2 = "ça va ?";
2
KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 015
Modifié par KX le 5/01/2013 à 17:10
"tous comme une instance de la dite même classe nous pourrions modifier ou appliquer de nouvelle méthode, non?"
Moi je considère une classe comme étant terminée, compilée, et plus jamais modifiée.
Donc une classe qui a 12 méthodes, en aura toujours 12, ce seront toujours les mêmes, et si tu veux en changer tu dois hériter. Essayes de modifier la classe String pour voir ^^

De plus, est ce que c'est deux annotations sont identiques?
Attention, il y a un piège :(

Lorsque tu mets un String directement entre guillemets, il y a un objet qui est créé (quelque part, on ne sait pas où, et tu n'y a pas accès), et qui est réutilisé à chaque fois que ce même String entre guillemets est réutilisé.

String s1 = "bonjour", s2 = "bonjour";
est équivalent à :

// objet système, caché quelque part 
String sys_bonjour = new String(new char[] {'b','o','n','j','o','u',''r'}); 

String s1= sys_bonjour, s2 = sys_bonjour;

Donc s1 et s2 sont deux références au même objet, tu peux par exemple faire : s1==s2, ce qui renverra true, car s1 et s2 sont identiques.

Tu pourras même faire directement s1=="bonjour", ce sera équivalent à s1==sys_bonjour, et renverra true également.

En revanche, si tu fais :
String s3 = new String("bonjour");
Ce sera équivalent à :
String s3 = new String(sys_bonjour);
Mais dans ce cas, l'objet s3 est une copie de sys_bonjour, ils ont la même valeur, mais ce n'est pas le même objet, donc s1==s3 renverra false, par contre bien sûr s1.equals(s3) renverra true.

Tu peux par exemple tester tes deux codes comme ceci ;

String s1 = new String("bonjour");  
String s2 = new String("ça va ?"); 
System.out.println(s1=="bonjour"); // false 
System.out.println(s2=="ça va ?"); // false 

String s1 = "bonjour" , s2 = "ça va ?"; 
System.out.println(s1=="bonjour"); // true 
System.out.println(s2=="ça va ?"); // true

Remarque : de manière générale il ne faut pas utiliser == pour comparer deux String, parce que ça ne renverra true que s'ils s'agit strictement du même objet, il faut utiliser equals pour comparer les valeurs de deux objets.
Autre remarque : j'ai appelé ma variable système "sys_bonjour", mais en réalité elle n'a pas ce nom là, d'ailleurs elle n'a très certainement aucun nom parce que ce n'est pas vraiment une variable, une fois la compilation terminée il reste juste un objet (référencé par s1 et s2).
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
5 janv. 2013 à 17:21
"System.out.println(s1=="bonjour"); // false "

Mouais mouais mouais il vaudrait mieux pas utiliser .equals() à la place? :-D
0
KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 015
5 janv. 2013 à 17:25
Si on mets equals on ne voit pas la différence entre ses deux codes, on ne voit pas où sont les objets qui sont identiques, et ceux qui sont de nouvelles instances de ces objets...
0
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
Modifié par arth le 5/01/2013 à 17:28
Aheum pardon tu parlais sans doute niveau emplacement c'est ça?

Edit : Vil sacripant, tu as rajouté le .equals() après ;-)
0
KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 3 015
5 janv. 2013 à 17:29
Je parlais surtout de comment sont instanciés les objets String qui sont directement écrits avec leur valeur entre guillemets :

String s1 = "bonjour";
Tous les String instanciés avec "bonjour" dans le même code sont identiques (c'est le même objet), contrairement aux objets instanciés avec "new String()" qui sont des objets différents (instanciés par copie)
0
binary-file Messages postés 521 Date d'inscription jeudi 2 décembre 2010 Statut Membre Dernière intervention 12 mai 2013 32
5 janv. 2013 à 17:03
Bon pour faire simple, tu a une classe que tu et dans un fichier *.class puis dans le main (ou ailleurs) tu l'instancie, c'est a dire que tu va utiliser cette classe comme variable en quelque sorte (je suis un grands débutant) et tu pourra utilisé les méthodes de celle ci.

exemple tu a une classe main et une classe test qui a une methode tuto

test test = new test(); // le deuxieme tst est le nom de l'instance, tu pourra par exemple l'appeller chose donc tu pourra faire ça :

test test = new test();
test.tuto(param);

ou

test test_autre_nom = new test(param);
test_autre_nom.tuto(param);

c'est moche mais c'est ce que moi j'ai compris x)

Cordialement
0
primel56 Messages postés 16 Date d'inscription samedi 14 janvier 2012 Statut Membre Dernière intervention 10 décembre 2013 6
10 déc. 2013 à 18:45
@binary-file : je suis un debutant moi aussi, mais j'ai compris les choses differements.

nomDeLaSuperClass nomDeLaVariable = new nomDeLaSuperClass();

en clair

nomDeL'instance nomDeLaVariable = new nomDeLaSuperClass();
_ton instance c'est comme un "type" pour ta variable que tu as deja créer dans ta super class
_le nom de ta variable
_et ici tu appel ta super class
0