2009-10-14 7 views
0

juste pour ma compréhension. Mon exemple de code ci-dessous modifie-t-il réellement la couleur de mon objet Car dans IntHashtable ou la première ligne crée-t-elle une autre instance de l'objet voiture , qui contient la couleur = rouge après la deuxième ligne?Objets en Java Référence ou Valeur

grâce,
Henrik

Car myCar = (Car)myIntHashTable.get(index); 
myCar.setColor = red; 

Edit:
Y at-il une meilleure façon que cela?

((Car)myIntHashTable.get(index)).setColor = red; 

Répondre

4

Il change l'attribut setColor en ce que red indique. Donc l'objet dans votre table de hachage est changé.

Une petite démo:

import java.util.*; 

public class Main { 

    public static void main(String[] args) { 
    List<Foo> foos = new ArrayList<Foo>(); 
    foos.add(new Foo()); 
    foos.add(new Foo()); 
    foos.add(new Foo()); 
    System.out.println("foos="+foos); 
    foos.get(1).n = 1; 
    System.out.println("foos="+foos); 
    } 

    static class Foo { 
    int n = 0; 
    @Override 
    public String toString() { 
     return String.valueOf(n); 
    } 
    } 
} 

produira:

foos=[0, 0, 0] 
foos=[0, 1, 0] 

Comme vous pouvez le voir, il n'y a pas non plus besoin pour la coulée lors de l'utilisation generics.

+0

Merci! C'est J2ME donc il n'y a pas de support générique :( –

+0

Ah J2ME, je vois (ne va pas pour Android? :)). Et vous êtes les bienvenus, bien sûr! –

+0

Actuellement travaillant sur un projet blackberry;) –

2

Il modifie réellement la valeur dans la table de hachage. Notez que si ce que vous faites change le hashCode d'un objet clé ou est égal à des valeurs de retour, vous pourriez être dans un monde blessé. En revanche, changer simplement la valeur de la table de hachage est généralement correct.

1

Pour répondre à votre deuxième question, si vous êtes en mesure de définir ce que l'Hashtable est:

Hashtable<Integer, Car> myHashTable = new Hashtable<Integer, Car>(); 

myHashTable.add(1, theCar); 

myHashTable.get(1).setColor(red); 
+4

Votre exemple est faux, car vous ne pouvez pas utiliser des types primitifs tels que 'int' pour les types génériques. Utilisez 'Integer' à la place, c'est-à-dire' Hashtable '. – Jesper

+0

Merci, je vais mettre à jour. (J'ai été gâté par.NET) – tster

1

Il change la valeur de la propriété « couleur » de l'instance Car stockées dans la table; une nouvelle valeur est et non créée. Aucun type pour myIntHashTable. Notez que java.util.Map est généralement préféré à l'ancien java.util.Hashtable. Ce dernier fait le verrouillage.

Également, indexez-vous ces voitures par des valeurs entières consécutives? Si oui, vous voudrez peut-être une forme de List.

Vous voulez probablement quelque chose comme ceci:

final Map<Integer, Car> cars = new HashMap<Integer, Car>(); 
final Car someCar = new Car(); 
cars.put(1, someCar); 
final Car carInTable = cars.get(1). // refers to same object as someCar 
carInTable.setColor(red); 

Une List mise en œuvre est similaire:

final List<Car> cars = new ArrayList<Car>(); 
final Car someCar = new Car(); 
cars.add(someCar); 
final Car carInTable = cars.get(1). // refers to same object as someCar 
carInTable.setColor(red); 

Sans Generics, faites la même casting:

final Map cars = new HashMap(); 
final Car someCar = new Car(); 
cars.put(1, someCar); 
final Car carInTable = (Car) cars.get(1). // refers to same object as someCar 
carInTable.setColor(red); 

final List cars = new ArrayList(); 
final Car someCar = new Car(); 
cars.add(someCar); 
final Car carInTable = (Car) cars.get(1). // refers to same object as someCar 
carInTable.setColor(red); 

Vous pouvez toujours comparer les références d'objets avec == lorsque vous êtes dans doute de savoir si deux objets sont le même objet:

System.println.out("someCar and carInTable are " + ((someCar == carInTable) ? "" : "not ") + "the same object"); 
4

variables de types non primitifs sont des références, donc dans votre exemple myCar est une référence à l'objet Car dans la table de hachage. Lorsque vous modifiez la valeur de la variable de membre setColor via la référence myCar, vous modifiez le contenu de l'objet Car qui se trouve dans la table de hachage.

Si myIntHashTable est un java.util.Hashtable ou java.util.HashMap normale, aucune copie de votre objet Car est fait.

Quelques notes supplémentaires:

  • Utilisation HashMap au lieu de Hashtable. Hashtable est une classe de collection héritée, qui a (pour presque toutes les fins) été remplacée par HashMap.
  • Il est un peu étrange que votre classe Car ait apparemment une variable membre publique appelée setColor. Ne rendez pas les variables membres publiques, et ne leur donnez pas de noms étranges tels que setColor.

A propos du dernier point: Mettez une variable membre privée color dans votre classe Car et mettre en œuvre une méthode setColor:

public class Car { 
    private Color color; 

    public void setColor(Color color) { 
     this.color = color; 
    } 

    // ... 
} 

// Somewhere else: 
myCar.setColor(Color.RED); 
+0

Mais en venant vom C++ et C#, en Java il n'y a aucun moyen de réellement changer une référence manuellement, n'est-ce pas? –

+2

Que voulez-vous dire exactement? Vous pouvez faire un point de référence à un objet différent; Il suffit d'assigner quelque chose d'autre à 'myCar', par exemple' myCar = new Car(); '. – Jesper

Questions connexes