réglage objets égal à eachother (java)
J'ai donc une classe appelée Personne qui ressemble à ceci
public class Person {
private String personName;
public String toString(){
return personName;
}
public Person(String personName){
this.personName = personName;
}
}
et une autre classe dans laquelle je suis la création de l'objet(s) personne
public class IdanJavaTask {
public static void main(String[] args) {
Person p1 = new Person("Bob");
System.out.println("p1 : " + p1);
Person p2 = new Person("Joe");
System.out.println("p2 :" + p2);
}
}
jusqu'ici tout va bien et mon instruction print est
p1: Bob
p2: Joe
Maintenant, je veux créer un nouvel objet, p3 et définissez égal à p1
ma classe ressemble maintenant à ceci:
public class IdanJavaTask {
public static void main(String[] args) {
Person p1 = new Person("Bob");
System.out.println("p1 : " + p1);
Person p2 = new Person("Joe");
System.out.println("p2 :" + p2);
Person p3 = new Person (p1);
System.out.println("p3 equal to p1:" + p3.equals(p1));
}
}
quand j'essaie de faire cela je reçois le message d'erreur suivant:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The constructor Person(Person) is undefined
at vehicleassignment.IdanJavaTask.main(IdanJavaTask.java:13)
Je pense que j'ai besoin d'ajouter une méthode à mon principal (la Personne) de la classe, mais je ne sais pas pourquoi, ni ce qu'à ajouter? pourquoi ne peux pas je viens de mettre les objets à l'eachother?
OriginalL'auteur Idan Gelber | 2015-06-15
Vous devez vous connecter pour publier un commentaire.
Il y a deux manières d'interpréter "définir les objets les uns des autres".
Est que vous voulez
p1
etp3
à consulter la même objet. Comme comment Clark Kent et Superman sont deux noms (références) pour la même personne. Pour cela, il faudrait:Dans ce scénario, si quelque chose arrive à
p1
, la même chose s'est produite àp3
. Si vous tuer Clark Kent, vous avez tué Superman (comme ils sont une seule et même chose). Java détermine l'égalité avec lesequals(Object o)
méthode - deux objetsa
etb
sont égaux ssia.equals(b)
etb.equals(a)
retourtrue
. Ces deux objets sont égaux à l'aide de la base deObject
définition de l'égalité, de sorte que vous n'avez pas à vous soucier de cela.L'autre façon d'interpréter le sens est de créer un nouveau objet de personne, qui se trouve être une copie exacte de la première personne. Pour ce faire, vous devez ajouter un autre constructeur de votre classe de personne qui prend une personne comme argument:
Avec cette configuration, vous pouvez faire ce que vous faites dans votre main.
Afin de rendre
p1
etp3
l'égalité, nous devons enseigner à la classe Personne à utiliser ses champs pour la vérification de l'égalité. Nous pouvons le faire en remplaçant laequals
méthode dans la classe personne.Chaque fois que nous remplacer le
equals
méthode, il est de bonne pratique de aussi remplacer lehashcode
méthode, qui renvoie un uniqueint
pour chaque Objet. Depuis le seul champ d'unePerson
objet a est son nom, nous pouvons simplement utiliser que hashcode.Donc, tous ensemble, notre classe Personne ressemble à ceci:
OriginalL'auteur Mshnik
Ce qui est connu comme un constructeur de copie. Vous aurez besoin de définir de façon explicite, dans ce cas:
Vous devez également remplacer le
equals()
méthode (et lahashCode()
méthode) afin de l'utiliser, sinon leequals()
méthode de la classe racineObject
serait utilisé, ce qui renvoie toujours false:Voir Quelles questions devraient être examinées lors de la substitution equals et hashCode en Java?.
OriginalL'auteur manouti
Pas d'objet en Java a un défaut constructeur de copie, à l'exception de autoboxed objets comme
Float
ouInteger
qui sont en fait copié.Cela signifie que dans tous les cas, il est de votre devoir de définir un constructeur de copie et de spécifier ce qui est copié, dans votre exemple:
Depuis en Java, tout est passé par référence, une plaine de cession voudrais juste faire 2 variables pointent vers la même instance, par exemple:
OriginalL'auteur Jack
Si vous voulez p3 de référence p2, ce qui signifie un changement de p2 sera mise à jour p3 et vice versa, il suffit de faire
si vous voulez cloner les données et les deux distincts, mais 'l'égalité' des copies de la personne, vous pouvez implémenter un constructeur en Personne qui prend une Personne et copie les valeurs dans les classes champs.
OriginalL'auteur Mark W