Tout en Java est considéré comme un objet, et l'objet d'opération est en fait une "référence" de l'objet d'opération. La relation entre les deux équivaut à utiliser la télécommande (référence) pour faire fonctionner le téléviseur (objet). Avoir une référence ne nécessite pas nécessairement qu'un objet lui soit associé, comme Sting a ; il suffit de déclarer qu'une référence n'est pas associée à un objet.
Une fois que vous avez créé une référence, vous souhaitez l'associer à un objet. Vous utilisez généralement new pour créer un nouvel objet (des chaînes en Java peuvent être créées. avec initialisation du texte cité).
(1) S'inscrire. La zone de stockage la plus rapide (située à l'intérieur du processeur) ne peut pas être directement contrôlée par des humains en Java (c++/c permet de suggérer des méthodes d'allocation de registre au compilateur).
(2) Pile. Situé dans la RAM, le pointeur de pile se déplace vers le bas pour allouer de la nouvelle mémoire et vers le haut pour libérer de la mémoire. C'est très rapide, juste derrière les registres. Mais lors de la création du système, le système Java doit connaître la période de déclaration exacte de tous les éléments stockés dans la pile afin de déplacer le pointeur de haut en bas. Cette contrainte limite la flexibilité du programme. Certains types de base de variables et de références d'objets (les objets Java n'en font pas partie) sont stockés sur la pile.
(3) Tas. Un pool de mémoire générale (situé dans la RAM) utilisé pour stocker tous les objets Java. L’avantage du tas est qu’il est différent de la pile : le compilateur n’a pas besoin de savoir combien de temps les données stockées dans le tas survivent. Lorsqu'un nouvel objet est créé, la mémoire est automatiquement allouée dans le tas pour le stockage. Le compilateur recycle automatiquement l'objet lorsqu'il n'est plus nécessaire sans contrôle humain. Bien entendu, cette flexibilité a un prix : la création d’objets sur la pile prend plus de temps qu’en C/C++.
(4) Stockage constant. Les valeurs constantes sont généralement stockées directement dans le code du programme car les valeurs constantes ne changent jamais.
(5) Stockage non RAM. Les données résident en dehors du programme et ne sont soumises à aucun contrôle de la part du programme. Tels que les objets de flux et les objets persistants.
Une série de types souvent utilisés en programmation, comme les entiers, les décimaux, les caractères... Ces types sont appelés types de base et font l'objet d'un traitement spécial.
Pourquoi devrions-nous être traités spécialement ? new stocke les objets dans le tas. Comme mentionné précédemment, les données stockées dans le tas prennent plus de temps, donc pour ces données fréquemment utilisées, particulièrement petites et simples, le coût de leur stockage dans le tas est trop élevé. Par conséquent, Java n'utilise pas new pour créer des variables, mais crée une variable « automatique » qui n'est pas une référence. Cette variable stocke la valeur directement et la place sur la pile. L'espace de stockage occupé par les types de base est fixe.
Afin de s'adapter au fait que tout est un objet, les types de base ont une classe wrapper, afin qu'un objet non basique puisse être créé dans le tas pour représenter le type de base correspondant.
Par exemple :
char c='a'; Character ch=new Character(c); 或者 Character ch=new Character('a');
La fonction d'empaquetage automatique de Java se5 peut automatiquement convertir entre les deux.
Portée des variables : les variables incluent des types de base et des références de classe qui stockent directement des valeurs. Survit uniquement dans le segment de code.
Portée de l'objet :
{ String s=new String("string"); }//end of scope
La référence s est stockée sur la pile et se termine à la fin de la portée. Cependant, l'objet String pointé par s continue de vivre dans le tas. C'est au garbage collector de Java de déterminer quand recycler l'objet. Cela élimine la plupart des problèmes de « fuite de mémoire ».
Java est différent de c/c++ De nombreuses personnes ne savent pas si les paramètres de méthode Java sont transmis par valeur ou par référence. Pour les types de données de base, les valeurs sont transmises, car les données de base stockent les valeurs directement dans la zone de pile. L'objet est passé par référence (la référence de l'objet dans la zone de pile est l'adresse de l'objet dans la zone de tas). Prenez String et StringBuilder pour illustrer.
Regardez deux exemples ci-dessous.
public class Test {public static void test(String str) { str = "world"+str; }public static void main(String[] args) { String str1 = new String("hello"); test(str1); System.out.println(str1); } }
Le résultat de sortie de l'exemple ci-dessus est toujours bonjour, pourquoi ? Étant donné que la modification de str dans le test n'est pas une modification de l'objet d'origine, cela implique les caractéristiques de l'objet String. L'objet String ne peut pas être modifié après sa création. La modification ci-dessus consiste en fait à créer un StringBuilder vide, puis à l'appeler. la méthode append pour l'insérer. "world", str, puis appelez la méthode toString pour créer un nouvel objet String. Ainsi, l'objet de référence de str est déjà tout nouveau à ce moment-là, donc str1 dans la fonction principale n'a pas changé. Regardons un autre exemple de StringBuilder.
public class test1 { static void test(StringBuilder str){ str.append("1234"); } public static void main(String[] args) { StringBuilder a=new StringBuilder("abc"); test(a); System.out.println(a.toString()); } }
Le résultat de sortie ci-dessus abc1234, la modification de str dans le test prend également effet sur a, car les références de str et a pointent vers le même objet StringBuilder, et StringBuilder peut Modifié. Il suffit de montrer que ce qui est transmis est une référence.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!