Référence Java à comprendre dans la figure

Vous avez peut-être appris les «références» en programmation Java. Certaines personnes peuvent le comprendre facilement, d'autres ne peuvent le comprendre que d'une manière ou d'une autre, ou certaines personnes ne peuvent pas le comprendre et sont en difficulté. Cet article utilise des diagrammes pour expliquer les «références» Java à ceux qui pensent «Je le comprends d'une manière ou d'une autre, mais je ne peux pas l'expliquer aux autres» ou «Je ne peux pas obtenir une image même si elle est expliquée par des mots». Ce sera un article à faire. Concernant la figure, elle n'est pas précise car elle exprime en fait ce qui est invisible à l'oeil et elle est composée du minimum d'informations. Notez s'il vous plaît.

Types primitifs et de référence

Il existe deux types de types Java: les types primitifs (types de données de base) et les types de référence. Les types primitifs sont des types qui commencent par toutes les lettres minuscules et peuvent se voir attribuer des valeurs de données spécifiques (valeurs numériques et caractères) qui sont écrites directement dans la mémoire. C'est aussi l'une des caractéristiques qu'il n'a pas de méthode contrairement au type de référence.

Nom du modèle Classification Taille (bit)
long entier 64
int entier 32
short entier 16
byte entier 8
double Fraction 64
float Fraction 32
boolean Authenticité ?
char lettre 16

Les huit ci-dessus sont des types primitifs et tous les autres sont des types de référence. Contrairement au type primitif, le type de référence se voit attribuer un pointeur (adresse en mémoire) sur l'objet nouvellement créé en tant que valeur de référence au lieu d'une valeur spécifique. L'objet ici est synonyme d'instance.

Tableau et chaîne

Ceux que je trouve personnellement faciles à mal comprendre sont les tableaux et les chaînes. Créez un objet car le tableau et la chaîne sont des types de référence.

//Type primitif
int i = 1;
//Type de référence
int[] array = {1, 2, 3};
String string = "pomme";

Le type int [] est exprimé en ajoutant à int, il est donc facile de se méprendre. Soyez prudent car le type int et le type int [] sont différents. Le type String attribue une chaîne, mais sachez que la chaîne est traitée comme un tableau de caractères à l'intérieur de l'objet String. Les trois derniers ont des notations différentes pour la création d'objets, mais ils sont tous équivalents. Veuillez noter que la même valeur et l'équivalent ont des significations différentes. Je vous serais reconnaissant de bien vouloir lire cet article pour l'équivalent et l'équivalent.

String a = "pomme";
String b = new String("pomme");
String c = new String(new char[]{'Ri', 'Hmm', 'Aller'});
System.out.println(a); //pomme
System.out.println(b); //pomme
System.out.println(c); //pomme

Je pense que la plupart des types String seront mémorisés avec les types primitifs lorsque vous commencerez à apprendre Java. Par conséquent, les personnes inexpérimentées en programmation ne comprennent souvent pas profondément la différence. Maintenant, utilisons un diagramme pour exprimer la différence entre le type primitif et le type de référence. WS000001.JPG Les variables de type Int affectent directement des valeurs de données de mémoire. Le type int [] crée un objet, le développe en mémoire et affecte le pointeur de cet objet à une variable comme valeur de référence. Le type String ressemble à ceci car la variable interne char [] a une valeur de référence pour l'objet char []. Après tout, comme il s'agit d'un ordinateur, la majeure partie est en mémoire, mais pour la lisibilité, les variables et les valeurs sont écrites séparément.

Qu'est-ce qui est nul

Null peut être affecté à une variable de type référence et il peut être exprimé qu'il n'y a pas de destination de référence pour cette variable. L'exception java.lang.NullPointerException (appelée nullpo) se produit lorsque vous essayez d'exécuter une méthode d'une variable qui n'a pas de référence. WS000003.JPG

Affecter à une variable

Une variable est une zone de mémoire allouée avec un nom, et le stockage d'une valeur dans cette zone est appelé affectation. L'affectation entre les variables signifie copier la valeur sur le côté droit et la stocker sur le côté gauche pour partager les données. WS000007.JPG Si vous ne comprenez pas les références, vous ne pourrez pas programmer correctement, alors ayons une idée solide. Maintenant, écrivons le code et voyons comment les valeurs sont transmises.

//[A] Type primitif
int intA = 1;
int intB = intA;
intB = 2;
System.out.println(intA); // 1
System.out.println(intB); // 2

//[B] Type de référence
char[] arrayA = {'A', 'B', 'C'};
char[] arrayB = arrayA;
arrayB[0] = 'D';
System.out.println(arrayA[0]); // D
System.out.println(arrayB[0]); // D

 //[C] Type de référence (immuable)
String stringA = "Chaîne";
String stringB = stringA;
stringB = "Chaîne";
System.out.println(stringA); //Chaîne
System.out.println(stringB); //Chaîne

Aucune explication n'est requise pour [A]. Il convient de noter [B] et [C]. [B] est assigné à arrayB et affecte arrayA, mais [C] n'affecte pas stringA. J'utiliserai également un diagramme pour expliquer ce qui se passe. WS000000.JPG Dans ③ de [B], la valeur des données est affectée au tableau de arrayB, mais puisque l'objet référencé est le même que arrayA (cela s'appelle la même valeur pour arrayA et arrayB), la sortie de arrayA et arrayB est la même. .. Dans [C], un nouvel objet String avec "Mojiretsu" est créé dans ③ et la valeur de référence est affectée à stringB, de sorte que la référence à l'objet "String" est coupée. Par conséquent, la sortie de stringA et stringB sera différente. En d'autres termes, si vous souhaitez modifier la valeur de l'objet String, vous devez affecter la valeur de données au tableau de caractères interne. Cependant, comme la variable char array à l'intérieur de la classe String est définie en private final, elle ne peut pas être réécrite. Une conception dans laquelle la valeur d'un objet ne peut pas être modifiée de cette manière est appelée immuable </ b>.

Appel de méthode

Il est facile de mal comprendre l'appel de méthode, alors imaginons le comportement du programme à partir du code et de la figure.

void main() {

  String string = "Chaîne";
  sub(string);
  System.out.println(string); //Chaîne

}
void sub(String string) {

  string = "Chaîne";

}

À première vue, il semble que vous attribuez une autre valeur à la variable transmise par main dans la méthode sub. Mais comprenez que vous transmettez la valeur de référence de l'objet auquel la variable fait référence, pas la variable. WS000002.JPG Les variables déclarées dans une méthode sont appelées variables locales pour cette méthode et ne peuvent être utilisées que dans cette méthode. Par conséquent, la méthode sub est appelée à partir de la méthode main et l'argument est passé, ce qui signifie que la variable chaîne de la méthode principale est affectée à la variable chaîne de la méthode sub. Je pense que c'est aussi un endroit où des malentendus sont susceptibles de se produire parce que les noms des variables sont les mêmes.

finalement

Il existe de nombreux articles sur le Web sur les références Java, mais je pense que la plupart sont expliqués en mots et en code. Si vous avez un bon sens de la programmation, vous pouvez le comprendre par lui-même, mais si vous ne le comprenez pas bien ou si vous commencez tout juste à apprendre, j'espère que cet article vous donnera une compréhension claire.

Recommended Posts

Référence Java à comprendre dans la figure
Classes et instances Java comprises dans la figure
[java8] Pour comprendre l'API Stream
Comment obtenir la date avec Java
[Java] Comment omettre le constructeur privé dans Lombok
Comprendre les caractéristiques de Scala en 5 minutes (Introduction à Scala)
Source utilisée pour obtenir l'URL de la source de redirection en Java
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
Thread Java pour comprendre vaguement
Entrée dans la console Java
Comment obtenir le nom d'une classe / méthode exécutée en Java
Comprendre le flux approximatif de la demande à la réponse dans SpringWebMVC
Reportez-vous à C ++ dans le module Android Studio (Java / kotlin)
[Android, Java] Méthode pratique pour calculer la différence en jours
Créer une méthode pour renvoyer le taux de taxe en Java
Comment dériver le dernier jour du mois en Java
Comment changer Java à l'ère d'OpenJDK sur Mac
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Accéder à l'interface réseau avec Java
Devinez le code de caractère en Java
Passer les paramètres régionaux i18n à JavaScript
Multithread pour s'adapter au modèle [Java]
Spécifiez l'emplacement Java dans eclipse.ini
Comment apprendre JAVA en 7 jours
Décompressez le fichier zip en Java
Enregistrer la sortie dans un fichier en Java
Bienvenue dans le marais des bibliothèques Java! !!
Analyser l'analyse syntaxique de l'API COTOHA en Java
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Essayez d'implémenter Yuma en Java
La route de JavaScript à Java
Comment concaténer des chaînes avec Java
Appelez la super méthode en Java
Comprendre comment la programmation fonctionnelle a été introduite dans Java d'un seul coup
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
[Android / Java] Comprendre le type de description dans les paramètres d'écoute (installation du bouton)
Juger si les chaînes de caractères à comparer sont les mêmes en Java
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Exemple de code pour appeler l'API Yahoo! Local Search en Java
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
Comment obtenir la longueur d'un fichier audio avec Java
Comment incrémenter la valeur de Map sur une ligne en Java
A propos du renvoi d'une référence dans un Java Getter
Obtenez le résultat de POST en Java
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Essayez de résoudre Project Euler en Java
[Java] Comment utiliser la classe File
[Explication facile à comprendre! ] Conversion de type de type de référence en Java
Facile à créer Slack Bot avec Java
Introduction à Java pour la première fois # 2
Essayez d'implémenter l'ajout n-aire en Java
Essayez d'utiliser l'API Stream en Java
Comprenez l'interface java à votre manière
Appelez l'API de notification Windows en Java
Java SE8 Silver ~ La route à franchir ~
À propos de la procédure pour que Java fonctionne