Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

probleme de création de nouvel objet avec java

15 réponses
Avatar
disease
Bonjour,
Je ne sais pas si ma question =E0 d=E9j=E0 =E9t=E9 pos=E9, mais j'ai un pro=
bl=E8me
quand je cr=E9e une instance d'une classe avec les m=EAmes valeurs
d'attribut qu'une autre d=E9j=E0 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=3DmaVieilleClasse.getAttribut1();
this.attribut2=3DmaVieilleClasse.getAttribut2();
...
}
}

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

c'est equivalent =E0
c2=3Dc1;

Avez vous une id=E9e de l'endroit o=F9 j'ai fait une erreur ?
Je vous remercie d'avance pour les r=E9ponse que vous pourrez me donner.

10 réponses

1 2
Avatar
toulemont.florian
On 16 fév, 15:52, disease wrote:
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.
Avatar
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
Avatar
disease
On 16 fév, 16:15, wrote:
On 16 fév, 15:52, disease wrote:



> 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é.
Avatar
disease
On 16 fév, 16:17, Fred wrote:
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)
Avatar
xael
disease a écrit :
On 16 fév, 16:17, Fred wrote:
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?
Avatar
disease
On 16 fév, 20:42, xael wrote:
disease a écrit :

> On 16 fév, 16:17, Fred wrote:
>> 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.
Avatar
Alain Ketterlin
disease writes:

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.
Avatar
disease
On 17 fév, 08:48, Alain Ketterlin wrote:
disease writes:
> 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.
Avatar
Christian Laborde
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 wrote:
disease a écrit :

On 16 fév, 16:17, Fred wrote:
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
Avatar
xael
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 wrote:
disease a écrit :

On 16 fév, 16:17, Fred wrote:
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
1 2