2011-11-09 3 views
2

Considérons le code suivant en Java.Les objets peuvent-ils être transmis par valeur plutôt que par référence en Java?

package obj; 

final class First 
{ 
    public int x; 

    public First(int x) 
    { 
     this.x=x; 
    } 
} 

final class Second 
{   
    public Second(First o) 
    { 
     o.x=10; 
    } 
} 

final public class Main 
{ 
    public static void main(String[] args) 
    { 
     First f=new First(50); 

     Second s=new Second(f); 

     System.out.println("x = "+f.x); 
    } 
} 

Dans le code ci-dessus, nous fournissons une valeur 50 à la déclaration First f=new First(50); qui est attribué à un membre de la classe x de type int dans le corps du constructeur dans la classe Première.


Dans la classe deuxième, l'objet f de la classe Première est transmis par la déclaration Deuxième s = new deuxième (f); et nous modifions la valeur de la variable d'instance x détenue dans cet objet à 10 qui affectera l'objet original f car les objets Java sont toujours passés par référence et non par valeur.


Dans certaines situations spécifiques, il peut être crucial de ne pas autoriser de tels changements sur les objets d'origine. Existe-t-il un mécanisme en Java qui pourrait nous permettre d'empêcher de telles modifications? (Cela pourrait nous permettre de passer des objets par valeur)

Répondre

9

Non, l'objet n'est pas passé du tout en Second. La référence est transmise par la valeur.

Java toujours utilise la valeur de passe, mais la valeur de toute expression est uniquement un type primitif ou une référence - jamais un objet.

Il semble que vous vouliez créer une copie d'un objet existant, puis transmettre une référence à ce nouvel objet à la méthode (par valeur). Tout ce qui constitue une "copie" dépendra des données de la classe. (Vous pouvez peut-être vous en sortir avec une copie superficielle, ou vous devrez peut-être aller plus loin, etc.)

+0

Il est probablement aussi important de mentionner que la plupart des classes du système de base ne feront que des copies superficielles, donc de faire une copie profonde d'une liste vous devez créer une nouvelle liste, puis parcourir la liste d'origine en créant des copies profondes du contenu – chrisbunney

3

Non, il n'y en a pas. Je dirais que votre exemple n'est pas très bon: si vous voulez vous assurer que quelque chose ne change pas, ne donnez pas les moyens de le changer. Causer le changement à être perdu par la suite est trompeur au mieux.

0
First f=new First(50); 
Second s=new Second(f); 

en première ligne que vous créez une variable de référence de type objet First et en 2ème ligne, il est de passer à Class Second
Alors que Jon Skeet dire en java « Java utilise toujours passer par valeur, mais la La valeur de toute expression n'est jamais qu'un type primitif ou une référence - jamais un objet. "
Et si, si u ne veulent pas changer la valeur de la propriété alors u doit être passer nouvel objet de la classe First
Parce que si u ont une référence d'une classe alors u peut changer la propriété de cette classe ..
Ou vous pouvez créer une copie de cet objet qui est à la fin créant un nouvel objet de First Class

Questions connexes