Constantes

"Amigo, saviez-vous qu'en Java, toutes les variables ne peuvent pas être modifiées ?"

"Comment ça, Kim ? En effet, le mot même "variable" parle de changement."

"Il n'y a aucun doute là-dessus. Comme beaucoup d'autres langages de programmation, Java a des constantes , c'est-à-dire des variables dont les valeurs ne peuvent pas être modifiées . Et le mot même 'constant' parle de constance."

« Et à quoi servent-ils ?

"Habituellement, ils sont utilisés pour une sorte de chose fondamentale comme le nombre Piou le nombre de jours dans les mois de l'année. Cela dit, en principe, un programmeur peut faire de n'importe quelle variable une constante, s'il décide que faire est donc nécessaire."

« Tu veux dire comme un nom, la couleur d'une voiture ou le nom d'un jour de la semaine ?

"Vous avez la bonne idée. Tout ce qui ne devrait pas être changé."

"Et à quoi ressemblent ces constantes en Java ?"

"Java a un mot-clé spécial pour eux : final. La création d'une variable immuable ressemble à la création d'une variable ordinaire. La seule différence est qu'avant le type de la variable, vous devez écrire le mot final, comme ceci :

final Type name = value;

"Que se passe-t-il si vous créez une constante et que vous essayez ensuite de lui attribuer une valeur différente ?"

"C'est la bonne question à poser ! Et la bonne réponse est la suivante : si vous essayez d'attribuer une valeur différente à une finalvariable, votre programme ne se compilera tout simplement pas."

"Et si vous déclarez une finalvariable mais ne lui attribuez pas de valeur ?"

"Cela ne sert à rien de faire cela, donc ce n'est pas non plus autorisé en Java. Une finalvariable doit être initialisée lors de sa déclaration, c'est-à-dire que vous devez lui affecter une valeur. Il existe une exception à cette règle : vous pouvez déplacer l'initialisation de une variable de classe statique dans un constructeur, mais vous en saurez plus plus tard.

"Cela dit, tout ce qui est n'est pas finalune constante. Pour réduire le nombre de mots clés, les développeurs Java utilisent le mot finalpour plus que simplement déclarer des constantes. finalpeut également s'appliquer aux méthodes et même aux classes. Les méthodes déclarées comme finalne peuvent pas être remplacées, et une classe déclaré comme finalne pouvant pas être hérité."

« Euh... Remplacé ? Hérité ? Quelle langue parlez-vous maintenant ? »

"Le langage de la programmation orientée objet. Vous y arriverez très bientôt. D'ici là, profitez simplement de la belle terminologie."

"D'accord. Donc, finalpeut être placé avant les variables, les classes et les méthodes, et ce mot-clé les rend immuables dans un certain sens ?"

"Oui. De plus, le finalmodificateur peut être ajouté avant toutes les variables : variables locales, paramètres de méthode, champs de classe et variables de classe statiques.

"Voici la chose importante à retenir : finalavant qu'un nom de variable ne soit juste une protection contre toute modification de cette variable . Si une variable stocke une référence à un objet, l'objet peut toujours être modifié."

"Je ne comprends pas très bien."

"Vous comprendrez très bientôt. Voici un exemple :

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
Nous créons un tableau.

Ceci n'est pas autorisé : la datavariable est déclarée comme final.

Mais vous pouvez le faire.
Et aussi ceci.

"Compris. C'est délicat."

Constantes globales

« Que pensez-vous des constantes globales ?

"Je suppose que les constantes globales sont probablement comme des variables globales, uniquement des constantes ?"

"Exactement. Si vous avez besoin de déclarer des constantes globales dans votre programme, créez des variables de classe statiques et faites-les publicet final. Il existe un style spécial pour les noms de ces variables : elles sont écrites en lettres majuscules, avec un caractère de soulignement utilisé pour mots séparés.

Exemples:

class Solution
{
   public static final String SOURCE_ROOT = "c:\\projects\\my\\";
   public static final int DISPLAY_WIDTH = 1024;
   public static final int DISPLAY_HEIGHT = 768;
}

Ombrage variable

"Comme je l'ai déjà dit, vous ne pouvez pas créer plusieurs variables locales avec les mêmes noms dans une seule méthode. Dans différentes méthodes, vous le pouvez."

"Je sais que!"

"Mais ce que vous ne savez probablement pas, c'est que les variables d'une classe et les variables locales d'une méthode peuvent très bien avoir le même nom.

Exemple:

Code Visibilité variable
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}

count, sum
count, sum
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

"Dans la addméthode, nous avons déclaré une variable locale nommée sum. Jusqu'à la fin de la méthode, elle masque (ou masque ) la sumvariable d'instance."

"Hmm... Je dirais que dans un certain sens, c'est le comportement attendu."

"Mais ce n'est pas la fin de l'histoire. Il s'avère que si une variable d'instance est masquée par une variable locale, il existe toujours un moyen de faire référence à la variable d'instance dans la méthode. Nous le faisons en écrivant le mot-clé avant son thisnom :

this.name

"Voici un exemple où le conflit de nom est résolu avec succès :

Code Visibilité variable
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}

this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

Les variables countet sumsont disponibles partout avec ou sans le thismot-clé. Sur les lignes où la sumvariable locale masque la sumvariable d'instance, la sumvariable d'instance n'est accessible qu'à l'aide du thismot-clé.

"De toute évidence, je vais devoir m'entraîner."

« Vous vous débrouillerez.

"Que se passe-t-il si une variable de classe statique est masquée plutôt qu'une simple variable d'instance (non statique) ? Vous ne pouvez pas y accéder viathis ?"

"C'est vrai. Le mot clé this ne fonctionnera pas. Vous devez vous y référer via le nom de la classe :

ClassName.name

Exemple:

Code Visibilité variable
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

"Attention : vous pouvez accéder aux variables statiques countet sumpartout avec ou sans utiliser le nom de la classe Solutioncomme préfixe. Dans les lignes où la sumvariable locale masque la sumvariable d'instance, l'accès à la sumvariable de classe n'est possible que lorsqu'elle est utilisée Solutioncomme préfixe.

Variables à l'intérieur d'une forboucle

"Et encore un petit fait intéressant. Il y a aussi un endroit où une variable est déclarée d'une manière spéciale - je parle de l'intérieur d'une forboucle ." Typiquement, une forboucle a une countervariable entre parenthèses. Et quelle sera la visibilité de cette variable ? Après tout, ce n'est pas dans le corps de la boucle. Est-ce toute la méthode ? Ou non?"

"J'ai déjà entendu quelque chose à ce sujet. Si je comprends bien, une variable déclarée dans l'en-tête d'une forboucle n'est visible que dans le corps de la boucle et dans l' en-tête de la forboucle ."

"Bravo, Amigo. Mais quand même, jetez un œil à un exemple pour renforcer ce matériel :

Code Visibilité variable
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

"Donc vous dites que dans mon code je pourrais écrire plusieurs boucles les unes après les autres avec une variable compteur du même nom, et qu'il n'y aura pas de problèmes ?"

"Il n'y aurait aucun problème. Tenez, regardez :

Code Visibilité variable
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i--)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a