probleme de création de nouvel objet avec java

Le
disease
Bonjour,
Je ne sais pas si ma question à déjà été posé, mais j'ai un pro=
blème
quand je crée une instance d'une classe avec les mêmes valeurs
d'attribut qu'une autre déjà existante.
Je m'explique :
j'ai une classe, que j'appellerais MaClasse qui a pour constructeur
quelque chose de ce genre

public class MaClasse implements IntrefaceDeMaClasse, Serializable{
private type attribut1;
private type attribut2;

public MaClasse () {
}
public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
this.attribut1=maVieilleClasse.getAttribut1();
this.attribut2=maVieilleClasse.getAttribut2();

}
}

et lorsque je fais
MaClasse c2 = new MaClasse(c1);

c'est equivalent à
c2=c1;

Avez vous une idée de l'endroit où j'ai fait une erreur ?
Je vous remercie d'avance pour les réponse que vous pourrez me donner.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
toulemont.florian
Le #18682751
On 16 fév, 15:52, disease
Bonjour,
Je ne sais pas si ma question à déjà été posé, mais j'ai un p roblème
quand je crée une instance d'une classe avec les mêmes valeurs
d'attribut qu'une autre déjà existante.
Je m'explique :
j'ai une classe, que j'appellerais MaClasse qui a pour constructeur
quelque chose de ce genre

public class MaClasse implements IntrefaceDeMaClasse, Serializable{
  private type attribut1;
  private type attribut2;
  ...
  public MaClasse () {
  }
  public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
    this.attribut1=maVieilleClasse.getAttribut1();
    this.attribut2=maVieilleClasse.getAttribut2();
    ...
  }

}

et lorsque je fais
MaClasse c2 = new MaClasse(c1);

c'est equivalent à
c2Á;

Avez vous une idée de l'endroit où j'ai fait une erreur ?
Je vous remercie d'avance pour les réponse que vous pourrez me donner.



En objet on utilise pas de "=" mais la fonction de l'object Object
equals(value Object);
Là t'auras une vraie comparaison d'objets.
Fred
Le #18682741
disease a écrit :
Bonjour,
Je ne sais pas si ma question à déjà été posé, mais j'ai un problème
quand je crée une instance d'une classe avec les mêmes valeurs
d'attribut qu'une autre déjà existante.
Je m'explique :
j'ai une classe, que j'appellerais MaClasse qui a pour constructeur
quelque chose de ce genre

public class MaClasse implements IntrefaceDeMaClasse, Serializable{
private type attribut1;
private type attribut2;
...
public MaClasse () {
}
public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
this.attribut1=maVieilleClasse.getAttribut1();
this.attribut2=maVieilleClasse.getAttribut2();



...
}
}

et lorsque je fais
MaClasse c2 = new MaClasse(c1);

c'est equivalent à
c2Á;

Avez vous une idée de l'endroit où j'ai fait une erreur ?
Je vous remercie d'avance pour les réponse que vous pourrez me donner.



Faudrait pas plutôt faire :
this.attribut1=new type(maVieilleClasse.getAttribut1());
this.attribut2=new type(maVieilleClasse.getAttribut2());


Fred
disease
Le #18682871
On 16 fév, 16:15, wrote:
On 16 fév, 15:52, disease


> Bonjour,
> Je ne sais pas si ma question à déjà été posé, mais j'ai un problème
> quand je crée une instance d'une classe avec les mêmes valeurs
> d'attribut qu'une autre déjà existante.
> Je m'explique :
> j'ai une classe, que j'appellerais MaClasse qui a pour constructeur
> quelque chose de ce genre

> public class MaClasse implements IntrefaceDeMaClasse, Serializable{
> private type attribut1;
> private type attribut2;
> ...
> public MaClasse () {
> }
> public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
> this.attribut1=maVieilleClasse.getAttribut1();
> this.attribut2=maVieilleClasse.getAttribut2();
> ...
> }

> }

> et lorsque je fais
> MaClasse c2 = new MaClasse(c1);

> c'est equivalent à
> c2Á;

> Avez vous une idée de l'endroit où j'ai fait une erreur ?
> Je vous remercie d'avance pour les réponse que vous pourrez me donner .

En objet on utilise pas de "=" mais la fonction de l'object Object
equals(value Object);
Là t'auras une vraie comparaison d'objets.



Comme vous pouvez le voir, il ne s'agit pas là d'une comparaison.
je veux dire que "MaClasse c2 = new MaClasse(c1);" == "c2Á;", ce qui
n'est pas le but recherché.
disease
Le #18682861
On 16 fév, 16:17, Fred
disease a écrit :



> Bonjour,
> Je ne sais pas si ma question à déjà été posé, mais j'ai un problème
> quand je crée une instance d'une classe avec les mêmes valeurs
> d'attribut qu'une autre déjà existante.
> Je m'explique :
> j'ai une classe, que j'appellerais MaClasse qui a pour constructeur
> quelque chose de ce genre

> public class MaClasse implements IntrefaceDeMaClasse, Serializable{
> private type attribut1;
> private type attribut2;
> ...
> public MaClasse () {
> }
> public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
> this.attribut1=maVieilleClasse.getAttribut1();
> this.attribut2=maVieilleClasse.getAttribut2();
> ...
> }
> }

> et lorsque je fais
> MaClasse c2 = new MaClasse(c1);

> c'est equivalent à
> c2Á;

> Avez vous une idée de l'endroit où j'ai fait une erreur ?
> Je vous remercie d'avance pour les réponse que vous pourrez me donner .

Faudrait pas plutôt faire :
this.attribut1=new type(maVieilleClasse.getAttribut1());
this.attribut2=new type(maVieilleClasse.getAttribut2());

Fred



Après test, cela ne change malheureusement rien.
plus precisement,
System.out.println(c1);
et
System.out.println(c2);
me revoient la même valeur
(ce n'est probablement pas très propre comme manière de verifier)
xael
Le #18684941
disease a écrit :
On 16 fév, 16:17, Fred
disease a écrit :



Bonjour,
Je ne sais pas si ma question à déjà été posé, mais j'ai un problème
quand je crée une instance d'une classe avec les mêmes valeurs
d'attribut qu'une autre déjà existante.
Je m'explique :
j'ai une classe, que j'appellerais MaClasse qui a pour constructeur
quelque chose de ce genre
public class MaClasse implements IntrefaceDeMaClasse, Serializable{
private type attribut1;
private type attribut2;
...
public MaClasse () {
}
public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
this.attribut1=maVieilleClasse.getAttribut1();
this.attribut2=maVieilleClasse.getAttribut2();
...
}
}
et lorsque je fais
MaClasse c2 = new MaClasse(c1);
c'est equivalent à
c2Á;
Avez vous une idée de l'endroit où j'ai fait une erreur ?
Je vous remercie d'avance pour les réponse que vous pourrez me donner.


Faudrait pas plutôt faire :
this.attribut1=new type(maVieilleClasse.getAttribut1());
this.attribut2=new type(maVieilleClasse.getAttribut2());

Fred



Après test, cela ne change malheureusement rien.
plus precisement,
System.out.println(c1);
et
System.out.println(c2);
me revoient la même valeur
(ce n'est probablement pas très propre comme manière de verifier)


Quand tu dis que ça te provoque une erreur, tu peux être plus clair.
c'est une erreur de compilation? à l'exécution? conceptuelle?
disease
Le #18687491
On 16 fév, 20:42, xael
disease a écrit :

> On 16 fév, 16:17, Fred >> disease a écrit :

>>> Bonjour,
>>> Je ne sais pas si ma question à déjà été posé, mais j'ai un problème
>>> quand je crée une instance d'une classe avec les mêmes valeurs
>>> d'attribut qu'une autre déjà existante.
>>> Je m'explique :
>>> j'ai une classe, que j'appellerais MaClasse qui a pour constructeur
>>> quelque chose de ce genre
>>> public class MaClasse implements IntrefaceDeMaClasse, Serializable{
>>> private type attribut1;
>>> private type attribut2;
>>> ...
>>> public MaClasse () {
>>> }
>>> public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
>>> this.attribut1=maVieilleClasse.getAttribut1();
>>> this.attribut2=maVieilleClasse.getAttribut2();
>>> ...
>>> }
>>> }
>>> et lorsque je fais
>>> MaClasse c2 = new MaClasse(c1);
>>> c'est equivalent à
>>> c2Á;
>>> Avez vous une idée de l'endroit où j'ai fait une erreur ?
>>> Je vous remercie d'avance pour les réponse que vous pourrez me donn er.
>> Faudrait pas plutôt faire :
>> this.attribut1=new type(maVieilleClasse.getAttribut1());
>> this.attribut2=new type(maVieilleClasse.getAttribut2());

>> Fred

> Après test, cela ne change malheureusement rien.
> plus precisement,
> System.out.println(c1);
> et
> System.out.println(c2);
> me revoient la même valeur
> (ce n'est probablement pas très propre comme manière de verifier)

Quand tu dis que ça te provoque une erreur, tu peux être plus clair.
c'est une erreur de compilation? à l'exécution? conceptuelle?



Et bien, je cherche à avoir 2 objets distinct c1 et c2, et là, c'est
comme si le deuxième objet c2 est un alias de c1. Si après la créatio n
de c2, je modifie un de ses attributs, c1 est aussi modifié. Je ne dis
pas que ça me provoque une erreur, je dis juste que mon code doit être
erroné quelque part.
Alain Ketterlin
Le #18687711
disease
public class MaClasse implements IntrefaceDeMaClasse, Serializable{
private type attribut1;
private type attribut2;
...
public MaClasse () {
}
public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
this.attribut1=maVieilleClasse.getAttribut1();
this.attribut2=maVieilleClasse.getAttribut2();
...
}
}

et lorsque je fais
MaClasse c2 = new MaClasse(c1);

c'est equivalent à
c2Á;



Non.

Dans le premier cas tu as deux objets distincts (le deuxieme est créé
par new et initialisé avec le constructeur qui apparait plus haut).
Dans le second cas tu as une deuxième variable (c2) qui désigne le
même objet. Les variables c1 et c2 ne sont pas les objets, seulement
des références vers les objets. Avec c2Á tu as deux références vers
le même objet. C'est comme cela pour tous les types-classes, mais
évidemment ce n'est pas pareil pour les types primitifs.

Note que dans le premier cas, si type n'est pas un type primitif,
selon la définition de getAttributX(), il se peut très bien que tu
aies deux objets distints, mais dont les attributs respectifs
désignent les mêmes objets (cad, c1.att1=Â.att1, et
c1.att1=Â.att2). Impossible de le savoir avec le code que tu nous
montres.

-- Alain.
disease
Le #18688171
On 17 fév, 08:48, Alain Ketterlin
disease > public class MaClasse implements IntrefaceDeMaClasse, Serializable{
> private type attribut1;
> private type attribut2;
> ...
> public MaClasse () {
> }
> public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
> this.attribut1=maVieilleClasse.getAttribut1();
> this.attribut2=maVieilleClasse.getAttribut2();
> ...
> }
> }

> et lorsque je fais
> MaClasse c2 = new MaClasse(c1);

> c'est equivalent à
> c2Á;

Non.

Dans le premier cas tu as deux objets distincts (le deuxieme est créé
par new et initialisé avec le constructeur qui apparait plus haut).
Dans le second cas tu as une deuxième variable (c2) qui désigne le
même objet. Les variables c1 et c2 ne sont pas les objets, seulement
des références vers les objets. Avec c2Á tu as deux référence s vers
le même objet. C'est comme cela pour tous les types-classes, mais
évidemment ce n'est pas pareil pour les types primitifs.

Note que dans le premier cas, si type n'est pas un type primitif,
selon la définition de getAttributX(), il se peut très bien que tu
aies deux objets distints, mais dont les attributs respectifs
désignent les mêmes objets (cad, c1.att1=Â.att1, et
c1.att1=Â.att2). Impossible de le savoir avec le code que tu nous
montres.

-- Alain.



Voici une partie de mon code (désolé pour la taille) :
[code]
[...]
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
[...]

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/



public class MaClasseImpl implements MaClasse, Serializable {


private String attrib1;

public String getattrib1() {
return attrib1;
}

public void setattrib1(String attrib1) {
this.attrib1 = attrib1;
}

public String getattrib2() {
return attrib2;
}

public void setattrib2(String attrib2) {
this.attrib2 = attrib2;
}

public String getattrib3() {
return attrib3;
}

public void setattrib3(String attrib3) {
this.attrib3 = attrib3;
}

private String attrib2;

private String attrib3;


private List<MaClasse2> list1;


private List<MaClasse2> list2;


public MaClasseImpl() {
this.list2 = new ArrayList<MaClasse2>();
this.list1 = new ArrayList<MaClasse2>();
}

public MaClasseImpl(MaClasse c){
this.attrib1=new String(c.getattrib1());
this.attrib2=new String(c.getattrib2());
this.attrib3=new String(c.getattrib3());
this.list1=new ArrayList<MaClasse2>(c.getlist1());
this.list2=new ArrayList<MaClasse2>(c.getlist2());
}

public List<MaClasse2> getlist2() {
return this.list2;
}

public List<MaClasse2> getlist1() {
return this.list1;
}

[...]
}
[/code]

Mon objectif est que c1 et c2 pointent chacun vers une instance
differente.
Christian Laborde
Le #18688781
Fred a raison. Il y a bien deux obgets distincts. Si on fait
c1 == c2 on aura false. Cependant, les attributs de c2 sont
des références aux attributs de c1. Voilà le problème.

disease a écrit :
On 16 fév, 20:42, xael
disease a écrit :

On 16 fév, 16:17, Fred
disease a écrit :
Bonjour,
Je ne sais pas si ma question à déjà été posé, mais j'ai un problème
quand je crée une instance d'une classe avec les mêmes valeurs
d'attribut qu'une autre déjà existante.
Je m'explique :
j'ai une classe, que j'appellerais MaClasse qui a pour constructeur
quelque chose de ce genre
public class MaClasse implements IntrefaceDeMaClasse, Serializable{
private type attribut1;
private type attribut2;
...
public MaClasse () {
}
public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
this.attribut1=maVieilleClasse.getAttribut1();
this.attribut2=maVieilleClasse.getAttribut2();
...
}
}
et lorsque je fais
MaClasse c2 = new MaClasse(c1);
c'est equivalent à
c2Á;
Avez vous une idée de l'endroit où j'ai fait une erreur ?
Je vous remercie d'avance pour les réponse que vous pourrez me donner.


Faudrait pas plutôt faire :
this.attribut1=new type(maVieilleClasse.getAttribut1());
this.attribut2=new type(maVieilleClasse.getAttribut2());
Fred


Après test, cela ne change malheureusement rien.
plus precisement,
System.out.println(c1);
et
System.out.println(c2);
me revoient la même valeur
(ce n'est probablement pas très propre comme manière de verifier)


Quand tu dis que ça te provoque une erreur, tu peux être plus clair.
c'est une erreur de compilation? à l'exécution? conceptuelle?



Et bien, je cherche à avoir 2 objets distinct c1 et c2, et là, c'est
comme si le deuxième objet c2 est un alias de c1. Si après la création
de c2, je modifie un de ses attributs, c1 est aussi modifié. Je ne dis
pas que ça me provoque une erreur, je dis juste que mon code doit être
erroné quelque part.



--
Christian Laborde
La Révolution citoyenne, c'est sur : http://c.lab.over-blog.com/
Le forum des électrons libres :
http://electrons-libres.forumactif.fr
True E-mail : remove -no-spam-
Sentier des Vinches
CH 1091 Grandvaux
Suisse
xael
Le #18690181
Christian Laborde a écrit :
Fred a raison. Il y a bien deux obgets distincts. Si on fait c1 == c2 on
aura false. Cependant, les attributs de c2 sont des références aux
attributs de c1. Voilà le problème.

disease a écrit :
On 16 fév, 20:42, xael
disease a écrit :

On 16 fév, 16:17, Fred
disease a écrit :
Bonjour,
Je ne sais pas si ma question à déjà été posé, mais j'ai un problème
quand je crée une instance d'une classe avec les mêmes valeurs
d'attribut qu'une autre déjà existante.
Je m'explique :
j'ai une classe, que j'appellerais MaClasse qui a pour constructeur
quelque chose de ce genre
public class MaClasse implements IntrefaceDeMaClasse, Serializable{
private type attribut1;
private type attribut2;
...
public MaClasse () {
}
public MaClasse ( InterfaceDeMaClasse maVieilleClasse ) {
this.attribut1=maVieilleClasse.getAttribut1();
this.attribut2=maVieilleClasse.getAttribut2();
...
}
}
et lorsque je fais
MaClasse c2 = new MaClasse(c1);
c'est equivalent à
c2Á;
Avez vous une idée de l'endroit où j'ai fait une erreur ?
Je vous remercie d'avance pour les réponse que vous pourrez me
donner.


Faudrait pas plutôt faire :
this.attribut1=new type(maVieilleClasse.getAttribut1());
this.attribut2=new type(maVieilleClasse.getAttribut2());
Fred


Après test, cela ne change malheureusement rien.
plus precisement,
System.out.println(c1);
et
System.out.println(c2);
me revoient la même valeur
(ce n'est probablement pas très propre comme manière de verifier)


Quand tu dis que ça te provoque une erreur, tu peux être plus clair.
c'est une erreur de compilation? à l'exécution? conceptuelle?



Et bien, je cherche à avoir 2 objets distinct c1 et c2, et là, c'est
comme si le deuxième objet c2 est un alias de c1. Si après la création
de c2, je modifie un de ses attributs, c1 est aussi modifié. Je ne dis
pas que ça me provoque une erreur, je dis juste que mon code doit être
erroné quelque part.





Les objets sont toujours passés par référence, donc même si ton nouvel
objet est une nouvelle instance, les attributs sont passés par
référence, il faut que tu les réinstancie également
Publicité
Poster une réponse
Anonyme