[Introduction à Java] Portée de la variable (portée, variable locale, variable d'instance, variable statique)

Objectif

Pour ceux qui viennent de commencer à apprendre la programmation, y compris le langage Java, et ceux qui l'ont déjà appris, pour examen J'écris pour apprendre la portée des variables.

La dernière fois, j'ai appris la Conversion de type. Cette fois à propos de ** portée variable **.

[Introduction à Java]

Quelle est la portée d'une variable?

La plage valide de variables qui sont littéralement définies. (La plage dans laquelle la variable peut être utilisée est limitée par l'endroit où la variable est déclarée)

・ Variables locales -Variable d'instance ・ Variable statique

Il existe plusieurs types de noms selon l'endroit où vous les déclarez.

Jetons un coup d'œil à la portée à l'aide d'un exemple simple.

Variables locales

La plage effective est différente pour chaque "{} unité de bloc". Il peut être utilisé dans le bloc après la position où la variable est déclarée.

Main.java


class Main {
  public static void main(String args[]) {
    String block1 = "Bloc 1";
    System.out.println(block1); //Bloc 1

    {
      String block2 = "Bloc 2";
      //Vous pouvez y accéder car c'est dans le bloc qui a déclaré block2
      System.out.println(block2); //Bloc 2
      
      //block1 est accessible
      System.out.println(block1); //Bloc 1
    }

    //Comme c'est en dehors du bloc qui a déclaré block2, une erreur de compilation se produira.
    System.out.println(block2); // block2 cannot be resolved to a variable
  }
}

Ce qui précède est un seul bloc, donc un exemple plus concret ...

** Vous ne pouvez pas accéder aux variables déclarées dans une méthode différente d'une autre méthode. ** **

Main.java


class Main {
  public static void main(String args[]) {
    //Déclaration et initialisation de la variable block1 dans la méthode main
    String block1 = "Bloc 1";
    System.out.println(block1); //Bloc 1
  }
  
  public static void method() {
    //Cette méthode, qui est hors limites, ne peut pas accéder à la variable block1, ce qui entraîne une erreur de compilation.
    block1 = "Bloc 3"; // block1 cannot be resolved to a variable
  }
}

** Vous ne pouvez pas accéder aux variables déclarées dans l'instruction if. ** **

Main.java


class Main {
  public static void main(String args[]) {
    String block1 = "Bloc 1";
    System.out.println(block1); //Bloc 1

    boolean flg = true;

    if(flg) {
      String block2 = "Bloc 2";
    }

    //Puisque la variable block2 est en dehors du bloc car elle a été définie dans l'instruction if, une erreur de compilation se produira.
    block2 = "Je veux réécrire le bloc 2"; // block2 cannot be resolved to a variable
}

Dans les deux cas, la plage valide de «{} bloc bloc» est différente, l'accès n'est donc pas possible et une erreur de compilation se produit.

Au fait, L'inférence de type de variable locale est disponible depuis JDK 10. Les détails seront résumés dans un article séparé à une date ultérieure, je vais donc l'omettre cette fois.

Variable d'instance

Une variable déclarée directement sous la définition de classe.

Person.java


class Person {
  //Définir des variables sous la classe (variables d'instance)
  String name;
  int age;
  int height;

  //Il est également accessible à partir des méthodes de la classe (non accessible à partir des méthodes statiques; voir ci-dessous)
  public void checkInfo() {
    System.out.print("Nom est"+ name + "、");
    System.out.print("L'âge est"+ age + "、");
    
    if(age < 20) {
      System.out.print("Mineur.");
    }

    System.out.println("Quelle est votre taille"+ height + "est.");
  }
}

Lorsque plusieurs objets sont créés (instanciés) avec le nouveau mot-clé basé sur la classe Person La valeur de la variable d'instance est différente pour chaque instance et différentes valeurs peuvent être gérées pour chaque objet. Accès avec "nom de variable auquel l'objet est affecté. Nom de variable d'instance".

Main.java



class Main {
  public static void main(String args[]) {
    Person tanaka = new Person(); //Créer un objet avec le nouveau mot-clé

    tanaka.name = "Tanaka"; //Dans le nom de variable tanaka auquel l'objet est affecté, la valeur est affectée au nom de variable d'instance.
    tanaka.age = 19; // //La valeur est affectée à la variable d'instance age avec le nom de variable tanaka à laquelle l'objet est affecté.

    System.out.println(tanaka.name); //Tanaka
    System.out.println(tanaka.age); // 19

    //↓ Les variables locales devaient être déclarées et initialisées,
    //Les variables d'instance sont automatiquement initialisées.
    System.out.println(tanaka.height); // 0

    tanaka.checkInfo(); //Le nom est Tanaka, l'âge de 19 ans et il est mineur. La hauteur est de 0.


    Person suzuki = new Person(); //Créer un objet avec un nouveau mot-clé

    suzuki.name = "Suzuki"; //La valeur est affectée au nom de la variable d'instance avec le nom de la variable suzuki à laquelle l'objet est affecté.
    suzuki.age = 51; //La valeur est affectée à la variable d'instance age avec le nom de variable suzuki à laquelle l'objet est affecté.
    suzuki.height = 146; //La valeur est affectée à la hauteur de variable d'instance avec le nom de variable suzuki à laquelle l'objet est affecté.

    System.out.println(suzuki.name); //Suzuki
    System.out.println(suzuki.age); // 51
    System.out.println(suzuki.height); // 146

    suzuki.checkInfo(); //Il s'appelle Suzuki, il a 51 ans et 146 ans.
  }
}

Cependant, il n'est pas accessible à partir de la méthode statique.

Les variables d'instance sont accédées avec ʻun nom de variable assigné à l'objet.nom de variable d'instance`, qui est instancié. Vous ne pouvez pas y accéder sauf si vous spécifiez de quelle instance il s'agit.

Par conséquent, si vous essayez d'y accéder sans être instancié, une erreur de compilation se produira.

Person2.java


class Person2 {
  //Définir des variables sous la classe
  String name;
  int age;

  //Aussi accessible depuis les méthodes de la classe
  public void checkInfo() {
    System.out.print("Nom est"+ name + "、");
    System.out.print("L'âge est"+ age + "、");
  }

  //Les variables d'instance ne sont pas accessibles à partir de méthodes statiques, ce qui entraîne une erreur de compilation
  public static void checkAge() {
    if(age < 20) {
      System.out.print("Mineur."); // Cannot make a static reference to the non-static field age
    }
  }
}

À propos de ça

Lorsque la variable locale et la variable d'instance ont le même nom, utilisez this pour indiquer explicitement la variable d'instance.

-Définir un argument avec le même nom que la variable d'instance dans la fonction de la classe -Lorsque la variable d'instance et l'argument ont le même nom

Person2.java


class Person2 {
  //Définir des variables sous la classe
  String name;
  int age;

  public void getName() {
    //Si aucun argument n'est reçu, une variable avec le même nom de variable que la variable d'instance peut être définie.
    String name = "getName()Le nom d'où j'ai appelé est Yamada";
    //Au lieu de sortir la variable d'instance, le nom défini dans cette méthode est émis de préférence.
    System.out.println(name);

    //Utilisez ceci lorsque vous souhaitez afficher le nom de la variable d'instance
    System.out.println("Le nom de la variable d'instance est" + this.name);
  }


  public void setAge(int age) {
    //Lorsque le même nom de variable que la variable d'instance est reçu comme argument,
    //Si vous essayez de définir avec le même nom de variable, vous obtiendrez une erreur s'il y a des doublons
    // int age = 101; // Duplicate local variable age

    //Utilisez ceci comme décrit ci-dessus lors de l'affectation de l'argument reçu à la variable d'instance
    this.age = age;
    System.out.println("L'âge de la variable d'instance définie par setAge est" + age);
  }
}

Main2.java


class Main2 {
  //Variable d'instance
  public static void main(String[] args) {
    Person2 sato = new Person2();
    sato.name = "Sato";
    sato.getName(); 
    // getName()Le nom d'où j'ai appelé est Yamada
    //Le nom de la variable d'instance est affiché sous la forme Sato

    sato.setAge(77);
    //L'âge de la variable d'instance définie par setAge est affiché comme 77
  }
}

variable statique (variable de classe)

Une variable déclarée directement sous la définition de classe. Lors de la déclaration d'une variable, elle est traitée comme une variable statique en spécifiant le modificateur static. La variable d'instance contenait une valeur pour chaque objet, Les variables statiques sont regroupées et conservent leurs valeurs (la même valeur est utilisée pour tous les objets). ''

** Les variables d'instance sont des variables pour chaque instance et les variables statiques (variables de classe) sont des variables pour chaque classe. ** **

Sample.java


class Sample {
  int number = 99; //Variable d'instance
  static String color = "Jaune"; //variable statique (variable de classe)

  //Une méthode pour définir une valeur dans une variable statique (variable de classe)
  public void setColor(String value) {
    color = value;
  }
}

Par conséquent, il est accessible sans instancier la classe. Nom de la classe.Nom de la variable statique (variable de classe )

Main.java


class Main {
  public static void main(String args[]) {
    Sample sample1 = new Sample();

    sample1.number = 10;
    System.out.println(sample1.number); // 10
    sample1.setColor("rouge");
    System.out.println(Sample.color); //rouge

    Sample sample2 = new Sample();
    //Puisque le nombre, qui est une variable d'instance, est conservé pour chaque objet, la valeur initiale de 99 est incluse.
    System.out.println(sample2.number); // 99

    //variable statique (variable de classe)Parce que la couleur de est une valeur commune
    //Le "jaune" par défaut est sample1.Le rouge a été réglé au moment de setColor.
    //Par conséquent, si vous accédez à la variable statique (variable de classe) ici, elle sera affichée en rouge.
    System.out.println(Sample.color); //rouge
  }
}

Puisque les variables statiques (variables de classe) sont des variables communes de la classe, tout changement affectera toutes les parties utilisées.

Délai d'utilisation des variables statiques (variables de classe)

Exemple) Lorsque vous souhaitez conserver des données sur le nombre de personnes créées.

Human.java


class Human {
  //Variable d'instance
  String name;

  //variable statique(Variable de classe)
  static int count = 0;

  //Variables statiques une fois instanciées(Variable de classe)À+1 faire
  Human() {
    count++;
  }

  public static void humanCount() {
    //Vérifiez combien de personnes ont été créées
    System.out.println(count + "Personne créée");
  }
}

Main.java


class Main {
  public static void main(String[] args) {
    Human yamada = new Human();
    yamada.name = "Yamada";
    System.out.println(yamada.name); //Yamada

    //Variables statiques de sortie (variables de classe)
    System.out.println(Human.count); // 1

    Human takeda = new Human();
    takeda.name = "Takeda";
    System.out.println(takeda.name); //Takeda

    //Variables statiques de sortie (variables de classe)
    System.out.println(Human.count); // 2

    Human oota = new Human();
    oota.name = "Ota";
    System.out.println(oota.name); //Ota

    //Variables statiques de sortie (variables de classe)
    System.out.println(Human.count); // 3

    Human.humanCount(); //Résultat que 3 personnes ont été créées
  }
}

À la fin

J'ai appris la portée des variables.

** Si vous programmez sans connaître la portée ... ** ・ ʻUne erreur peut se produireVous pouvez attribuer une valeur à une variable à un endroit involontaire (elle a été attribuée même si vous n'aviez pas l'intention de l'attribuer)`

Cela peut causer des problèmes tels que des mouvements inattendus.

Je pense que les problèmes ci-dessus peuvent être évités en le mettant en œuvre en tenant compte de la plage d'influence de la portée.

La prochaine fois, je me pencherai sur le fonctionnement des chaînes de caractères (en préparation).

Recommended Posts

[Introduction à Java] Portée de la variable (portée, variable locale, variable d'instance, variable statique)
[Introduction à Java] À propos des variables et des types (déclaration de variable, initialisation, type de données)
Portée de la variable Java (portée)
Portée de la variable Java
[Java] Introduction à Java
[Introduction à Java] À propos des déclarations et des types de variables
Introduction à Java
Introduction à la commande java
Portée de la variable Java (plage où les variables peuvent être vues)
[Java Silver] Que sont les variables de classe, les variables d'instance et les variables locales?
Passez des variables à Scope.
[Java] Introduction à l'expression lambda
[java] Raisons d'utiliser statique
Comment utiliser les variables Java
[Java] Introduction à l'API Stream
[Introduction aux jeux Janken (comme)] Java
[Introduction à Java] À propos des expressions lambda
[Introduction à Java] À propos de l'API Stream
Introduction à la programmation fonctionnelle (Java, Javascript)
[Traitement × Java] Comment utiliser les variables
Comment écrire une déclaration de variable Java
Introduction initiale à Mac (ingénieur Java)
Attribuer les résultats de l'évaluation aux variables Java
Comment nommer des variables en Java
[Connaissance de base de Java] Portée des variables
Les variables locales Java sont thread-safe
Introduction à Java pour la première fois # 2
Introduction à la programmation pour les étudiants du collégial: variables
Différence entre la variable d'instance Ruby et la variable locale
Point 57 Réduire la portée des variables locales
Introduction aux algorithmes avec java-Search (recherche prioritaire en profondeur)
[Introduction à Java] Comment écrire un programme Java
Point 57: Minimiser la portée des variables locales
[Java] Différences entre les variables d'instance et les variables de classe
Fonctions de portée Kotlin à envoyer aux développeurs Java
Sortie du livre "Introduction à Java"
Introduction aux algorithmes avec java --Search (recherche de priorité de largeur)
variable statique
Java statique
[Java] Introduction
Concept d'instance ・ Variable de type de classe ・ Constructeur ・ Membre statique
[Introduction à Java] À propos de la conversion de type (distribution, promotion)
Introduction aux algorithmes avec java --Search (bit full search)
Ingénieur en route vers Java Partie 1 Introduction et construction de l'environnement
À propos de var utilisé en Java (type de variable locale)
[Mensuel 2017/04] Introduction à groovy !! ~ Comparaison de grammaire / spécification Java ~
Premiers pas avec Groovy pour les ingénieurs Java gênants
[Introduction à Java] Bases de l'arithmétique Java (pour les débutants)