Comment transmettre la classe Entier sur le lien?
J'espère que quelqu'un peut clarifier pour moi ce qui se passe ici. J'ai frappé un peu en classe integer, Mais depuis integer
Survoler
opérateur
, Je ne pouvais pas comprendre ce qui n'allait pas. Mon problème avec cette chaîne est:
Voici mon raisonnement:
Je sais que Java est pass by value /
https://coderoad.ru/40480/
/, Par conséquent, je pense que dans l'exemple suivant, un objet entier devrait augmenter à chaque fois.
C'est mon résultat attendu:
Inc: 1
main: 1
Inc: 2
main: 2
Inc: 3
main: 3
Inc: 4
main: 4
Inc: 5
main: 5
Inc: 6
main: 6
...
C'est la production réelle.
Inc: 1
main: 0
Inc: 1
main: 0
Inc: 1
main: 0
...
Pourquoi se comporte-t-il comme ça?
Survoler
opérateur
+
, Je ne pouvais pas comprendre ce qui n'allait pas. Mon problème avec cette chaîne est:
Integer i = 0;
i = i + 1; // ← I think that this is somehow creating a new object!
Voici mon raisonnement:
Je sais que Java est pass by value /
https://coderoad.ru/40480/
/, Par conséquent, je pense que dans l'exemple suivant, un objet entier devrait augmenter à chaque fois.
public class PassByReference {
public static Integer inc/Integer i/ {
i = i+1; // I think that this must be **sneakally** creating a new integer...
System.out.println/"Inc: "+i/;
return i;
}
public static void main/String[] args/ {
Integer integer = new Integer/0/;
for /int i =0; i<10; i++/{
inc/integer/;
System.out.println/"main: "+integer/;
}
}
}
C'est mon résultat attendu:
Inc: 1
main: 1
Inc: 2
main: 2
Inc: 3
main: 3
Inc: 4
main: 4
Inc: 5
main: 5
Inc: 6
main: 6
...
C'est la production réelle.
Inc: 1
main: 0
Inc: 1
main: 0
Inc: 1
main: 0
...
Pourquoi se comporte-t-il comme ça?
Aucun résultat connexe trouvé
Invité:
Pour répondre aux questions, connectez-vous ou registre
9 réponses
Hannah12
Confirmation de:
Un entier est transmis par la valeur, pas par référence. Changer la référence à l'intérieur de la méthode ne sera pas reflétée dans la liaison transmise de la méthode d'appel.
Un entier est immuable. Il n'y a pas de tel méthode que
. Sinon, vous pourriez simplement l'utiliser.
Pour le forcer à travailler, vous devez réaffecter la méthode de retour de la méthode.
.
Pour en apprendre un peu plus sur la transmission par valeur, voici un autre exemple:
Gaspard
Confirmation de:
Gilbert
Confirmation de:
Si une personne doit transmettre le nombre qui devrait être mis à jour globalement, utilisez
/ Au lieu de créer différentes classes de shell proposées ou s'appuyant sur des bibliothèques tiers.
/, Bien sûr, principalement utilisé pour l'accès à fil-sûr, mais si la chute des performances n'est pas un problème, pourquoi ne pas utiliser cette classe intégrée. Un bonus supplémentaire est bien sûr une sécurité de fil évidente.
Gilles
Confirmation de:
Utilisation
https://commons.apache.org/pro ... .html
de la bibliothèque Apache Commons.
Créez une classe d'utilisateurs comme indiqué ci-dessous
Voici un exemple de code pour cela:
Sortir:
Edouard
Confirmation de:
, Et comportement de bus. Classer
est immuable et votre code:
Considéré par un compilateur /Après un bus/ comme:
Donc, vous avez raison dans votre conclusion qu'une instance
changé, mais pas caché - Ceci est cohérent avec la définition de la langue Java :-/
Agathe
Confirmation de:
Premièrement: un entier est immuable.
Deuxièmement: la classe d'entier ne remplace pas l'opérateur
, Dans cette ligne, il y a une boîte automatique et aide /dans les anciennes versions Java Vous obtiendrez une erreur dans la ligne ci-dessus/.
Quand vous écrivez
, Le compilateur d'abord convertit un entier dans /primitif/
Pour effectuer une addition: autounboxing. Suivant, faisant
Le compilateur convertit la valeur
à /Nouveau/ entier: autoboxing.
De cette façon,
effectivement appliqué à la primitive
s.
</some>
Guillaume
Confirmation de:
Cette partie de votre code:
Cela revient vraiment au code qui ressemble à ceci:
Ce qui va sans dire .. ne change pas les liens transmis.
Vous pouvez le corriger avec quelque chose comme ça
Hannah
Confirmation de:
Alors vous verrez qu'il imprime toujours "false".
Cela signifie que l'ajout crée une nouvelle copie. Integer et l'enregistre dans
Local
variable i /"local", car i est en fait une copie du lien référencé/, Laissant la variable de la méthode causée intacte.
Entier est une classe immuable, c'est-à-dire que vous ne pouvez pas changer sa valeur, mais devriez avoir une nouvelle instance. Dans ce cas, vous n'avez pas à le faire manuellement comme ceci:
Au lieu de cela, cela se fait avec l'aide de Supersay.
Darius
Confirmation de:
Classe ouverte UnderstandingObjects {
}
Classer IntObj {
Entier a;
}