Maison >Java >javaDidacticiel >Explication détaillée de la portée des variables et objets Java (image et texte)

Explication détaillée de la portée des variables et objets Java (image et texte)

黄舟
黄舟original
2017-03-29 11:01:482412parcourir

Cet article présente principalement les connaissances pertinentes sur la portée des variables Java et des objets. Il a une très bonne valeur de référence, jetons un oeil avec l'éditeur ci-dessous

La plupart des langages de programmation proposent la notion de « Scope ».

Pour un nom défini dans un scope, le scope détermine à la fois sa « visibilité » et son « temps d'existence ». En C, C++ et Java, la portée est déterminée par la position des accolades.

Portée des variables

Exemple :

{
  int x = 12;
  /* only x available */
  {
    int q = 96;
    /* both x & q available */
  }
  /* only x available */
  /* q “out of scope” */
}

Java utilise une paire d'accolades comme portée d'une instruction block , appelé portée, en tant que variable définie dans la portée, il ne peut être utilisé qu'avant la fin de la portée.

Vous ne pouvez pas écrire de code comme celui-ci en Java :

 {
   int x = 12;
   {
     int x = 96; /* illegal */
   }
 }

Le compilateur Java pensera que la variable a été définie, donc la variable dans la portée ne peut pas être définie à plusieurs reprises, mais dans C et C++ La possibilité de "masquer" une variable dans une portée plus large est autorisée en C et C++, mais pas en Java car les concepteurs de Java pensent que cela perturbe le programme.

Regardons deux autres exemples. Afin de permettre à tout le monde de voir l'effet, des captures d'écran sont utilisées ici :

②.

Regardons à nouveau ce code. Réfléchissons à une question Quels sont les comportements des lignes 11 et 12 qui ne sont pas des erreurs grammaticales? Le code est le suivant :

Si on échange les positions, le code est le suivant :

Après avoir quitté la portée, l'espace mémoire alloué par la variable sera récupéré par la JVM, il n'y aura donc pas d'erreurs de syntaxe. Cependant, la deuxième façon d'écrire le nom ne quitte pas la portée {}, il y aura donc des erreurs de syntaxe.

Les variables ci-dessus sont toutes des variables locales, alors que se passera-t-il s'il y a des variables globales ? Parlons code, le code est le suivant :

Si vous observez attentivement et réfléchissez au code, vous pouvez tirer la conclusion suivante sur la portée de la variable :

in Le nom de la variable

globale

et le nom de la variable locale peuvent avoir le même nom de variable sous le même package de portée. La variable locale et la variable locale sous le même package de portée ne peuvent pas avoir la même variable. nom (pas dans la portée). Lors de l'utilisation d'une variable, si vous ne spécifiez pas si vous souhaitez utiliser une variable globale ou une variable locale, la valeur par défaut est d'utiliser la variable locale. Cependant, si la variable locale dépasse son. propre portée, elle deviendra invalide et sera récupérée par la JVM. Vous pouvez ensuite renommer cette variable et utiliser la dernière variable locale définie.

La portée de l'objet

Les objets Java n'ont pas la même durée d'existence que les types Zhu. Lorsque vous créez un objet Java à l'aide du mot-clé

new

, il sera hors de portée. Donc si vous utilisez le code suivant :

alors le handle s, c'est-à-dire la
 {
   String s = new String("a string");
 } /* 作用域的终点 */
référence

disparaîtra à la fin du scope. Cependant, l'objet String pointé par s occupe toujours de l'espace mémoire. Dans le code ci-dessus, nous n'avons aucun moyen de continuer à utiliser cet objet car le seul handle pointant vers lui a dépassé les limites de la portée. Le résultat est le suivant : pour les objets créés avec du nouveau, ils resteront aussi longtemps que nous le souhaitons. Ce problème de

Programmation

est particulièrement important en C et C++. Le plus gros problème est en C++ : comme vous ne pouvez obtenir aucune aide du langage, vous ne pouvez pas être sûr que les objets soient disponibles lorsque vous en avez besoin. Et le plus gênant, c'est qu'en C++, une fois le travail terminé, l'objet doit être effacé manuellement.

Cela soulève une question intéressante. Si Java permet aux objets de rester les mêmes, comment pouvons-nous les empêcher de remplir la mémoire et éventuellement de provoquer le "gel" du programme. En C++, ce problème est le plus gros casse-tête pour les programmeurs. Mais après Java, la donne a changé. Java dispose d'un "garbage collector" spécial qui recherche tous les objets créés avec new et identifie lesquels d'entre eux ne sont plus référencés. Il libère ensuite automatiquement la mémoire occupée par ces objets inactifs afin qu'elle puisse être utilisée par de nouveaux objets. Cela signifie que nous n'avons pas du tout à nous soucier de la récupération de la mémoire. Il suffit de créer des objets et ils disparaîtront automatiquement une fois qu'ils ne seront plus nécessaires. Cela évite un problème de programmation courant en C++ : le "débordement de mémoire" causé par le programmeur oubliant de libérer de la mémoire.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn