[Einführung in Java] Variablenbereich (Bereich, lokale Variable, Instanzvariable, statische Variable)

Zweck

Für diejenigen, die gerade angefangen haben, Programmieren einschließlich der Java-Sprache zu lernen, und diejenigen, die es bereits gelernt haben, zur Überprüfung Ich schreibe, um den Umfang der Variablen zu lernen.

Beim letzten Mal habe ich etwas über [Typkonvertierung] erfahren (https://qiita.com/morioheisei/items/28ab5fd69570e01cd317). Diesmal über ** variablen Umfang **.

[Einführung in Java]

Was ist der Umfang einer Variablen?

Der gültige Bereich von Variablen, die buchstäblich definiert sind. (Der Bereich, in dem die Variable verwendet werden kann, ist durch die Stelle begrenzt, an der die Variable deklariert wird.)

・ Lokale Variablen -Instanzvariable ・ Statische Variable

Es gibt mehrere Arten von Namen, je nachdem, wo Sie sie deklarieren.

Schauen wir uns den Umfang anhand eines einfachen Beispiels an.

Lokale Variablen

Der effektive Bereich ist für jede "{} Blockeinheit" unterschiedlich. Es kann im Block nach der Position verwendet werden, an der die Variable deklariert ist.

Main.java


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

    {
      String block2 = "Block 2";
      //Sie können darauf zugreifen, da es sich in dem Block befindet, der Block2 deklariert hat
      System.out.println(block2); //Block 2
      
      //Auf Block1 kann zugegriffen werden
      System.out.println(block1); //Block 1
    }

    //Da es außerhalb des Blocks liegt, der Block2 deklariert hat, tritt ein Kompilierungsfehler auf.
    System.out.println(block2); // block2 cannot be resolved to a variable
  }
}

Das obige ist ein einzelner Block, also ein konkreteres Beispiel ...

** Sie können nicht auf Variablen zugreifen, die in einer anderen Methode als einer anderen Methode deklariert wurden. ** **.

Main.java


class Main {
  public static void main(String args[]) {
    //Deklarieren und Initialisieren der Variablen block1 in der Hauptmethode
    String block1 = "Block 1";
    System.out.println(block1); //Block 1
  }
  
  public static void method() {
    //Diese Methode, die außerhalb des Bereichs liegt, kann nicht auf die Variable block1 zugreifen, was zu einem Kompilierungsfehler führt.
    block1 = "Block 3"; // block1 cannot be resolved to a variable
  }
}

** Sie können nicht auf die in der if-Anweisung deklarierten Variablen zugreifen. ** **.

Main.java


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

    boolean flg = true;

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

    //Da sich die Variable block2 außerhalb des Blocks befindet, weil sie in der if-Anweisung definiert wurde, tritt ein Kompilierungsfehler auf.
    block2 = "Ich möchte Block 2 neu schreiben"; // block2 cannot be resolved to a variable
}

In beiden Fällen ist der gültige Bereich von "{} Block Unit" unterschiedlich, sodass kein Zugriff möglich ist und ein Kompilierungsfehler auftritt.

Apropos, Local-Variable Type Inference ist seit JDK 10 verfügbar. Details werden zu einem späteren Zeitpunkt in einem separaten Artikel zusammengefasst, daher werde ich diesmal darauf verzichten.

Instanzvariable

Eine Variable, die direkt unter der Klassendefinition deklariert ist.

Person.java


class Person {
  //Variablen unter Klasse definieren (Instanzvariablen)
  String name;
  int age;
  int height;

  //Es kann auch über Methoden innerhalb der Klasse zugegriffen werden (nicht über statische Methoden zugänglich; siehe unten).
  public void checkInfo() {
    System.out.print("Name ist"+ name + "、");
    System.out.print("Alter ist"+ age + "、");
    
    if(age < 20) {
      System.out.print("Minderjährig.");
    }

    System.out.println("Wie groß bist du"+ height + "ist.");
  }
}

Wenn mehrere Objekte mit dem neuen Schlüsselwort basierend auf der Person-Klasse erstellt (instanziiert) werden Der Wert der Instanzvariablen ist für jede Instanz unterschiedlich, und für jedes Objekt können unterschiedliche Werte verarbeitet werden. Zugriff mit Variablenname, dem das Objekt zugewiesen ist. Name der Instanzvariable.

Main.java



class Main {
  public static void main(String args[]) {
    Person tanaka = new Person(); //Erstellen Sie ein Objekt mit dem neuen Schlüsselwort

    tanaka.name = "Tanaka"; //In dem Variablennamen tanaka, dem das Objekt zugewiesen ist, wird der Wert dem Namen der Instanzvariablen zugewiesen.
    tanaka.age = 19; // //Der Wert wird der Instanzvariablen age mit dem Variablennamen tanaka zugewiesen, dem das Objekt zugewiesen ist.

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

    //↓ Lokale Variablen mussten deklariert und initialisiert werden,
    //Instanzvariablen werden automatisch initialisiert.
    System.out.println(tanaka.height); // 0

    tanaka.checkInfo(); //Der Name ist Tanaka, das Alter ist 19 und er ist minderjährig. Höhe ist 0.


    Person suzuki = new Person(); //Erstellen Sie ein Objekt mit dem neuen Schlüsselwort

    suzuki.name = "Suzuki"; //Der Wert wird dem Instanzvariablennamen mit dem Variablennamen suzuki zugewiesen, dem das Objekt zugewiesen ist.
    suzuki.age = 51; //Der Wert wird der Instanzvariablen age mit dem Variablennamen suzuki zugewiesen, dem das Objekt zugewiesen ist.
    suzuki.height = 146; //Der Wert wird der Instanzvariablenhöhe mit dem Variablennamen suzuki zugewiesen, dem das Objekt zugewiesen ist.

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

    suzuki.checkInfo(); //Er heißt Suzuki, ist 51 Jahre alt und 146 Jahre alt.
  }
}

Der Zugriff über die statische Methode ist jedoch nicht möglich.

Auf Instanzvariablen wird mit "Objekt zugewiesener Variablenname. Instanzvariablenname" zugegriffen, der instanziiert wird. Sie können nur darauf zugreifen, wenn Sie angeben, um welche Instanz es sich handelt.

Wenn Sie versuchen, ohne Instanziierung darauf zuzugreifen, tritt daher ein Kompilierungsfehler auf.

Person2.java


class Person2 {
  //Definieren Sie Variablen unter Klasse
  String name;
  int age;

  //Auch über Methoden in der Klasse zugänglich
  public void checkInfo() {
    System.out.print("Name ist"+ name + "、");
    System.out.print("Alter ist"+ age + "、");
  }

  //Auf Instanzvariablen kann nicht mit statischen Methoden zugegriffen werden, was zu einem Kompilierungsfehler führt
  public static void checkAge() {
    if(age < 20) {
      System.out.print("Minderjährig."); // Cannot make a static reference to the non-static field age
    }
  }
}

Darüber

Wenn die lokale Variable und die Instanzvariable denselben Namen haben, geben Sie mit "this" die Instanzvariable explizit an.

-Definieren Sie ein Argument mit demselben Namen wie die Instanzvariable in der Funktion in der Klasse -Wenn die Instanzvariable und das Argument denselben Namen haben

Person2.java


class Person2 {
  //Definieren Sie Variablen unter Klasse
  String name;
  int age;

  public void getName() {
    //Wenn kein Argument empfangen wird, kann eine Variable mit demselben Variablennamen wie die Instanzvariable definiert werden.
    String name = "getName()Der Name, von dem ich angerufen habe, ist Yamada";
    //Anstatt die Instanzvariable auszugeben, wird der in dieser Methode definierte Name bevorzugt ausgegeben.
    System.out.println(name);

    //Verwenden Sie diese Option, wenn Sie den Namen der Instanzvariablen ausgeben möchten
    System.out.println("Der Name der Instanzvariablen lautet" + this.name);
  }


  public void setAge(int age) {
    //Wenn derselbe Variablenname wie die Instanzvariable als Argument empfangen wird,
    //Wenn Sie versuchen, mit demselben Variablennamen zu definieren, tritt ein Fehler auf, wenn Duplikate vorhanden sind.
    // int age = 101; // Duplicate local variable age

    //Verwenden Sie dies wie oben beschrieben, wenn Sie das empfangene Argument der Instanzvariablen zuweisen
    this.age = age;
    System.out.println("Das Alter der von setAge festgelegten Instanzvariablen beträgt" + age);
  }
}

Main2.java


class Main2 {
  //Instanzvariable
  public static void main(String[] args) {
    Person2 sato = new Person2();
    sato.name = "Sato";
    sato.getName(); 
    // getName()Der Name, von dem ich angerufen habe, ist Yamada
    //Der Name der Instanzvariablen wird als Sato ausgegeben

    sato.setAge(77);
    //Das Alter der von setAge festgelegten Instanzvariablen wird als 77 ausgegeben
  }
}

statische Variable (Klassenvariable)

Eine Variable, die direkt unter der Klassendefinition deklariert ist. Wenn eine Variable deklariert wird, wird sie durch Angabe des statischen Modifikators als statische Variable behandelt. Die Instanzvariable enthielt einen Wert für jedes Objekt. Statische Variablen werden an einer Stelle zusammengefasst, um den Wert zu speichern (der gleiche Wert wird für alle Objekte verwendet). ``

** Instanzvariablen sind Variablen für jede Instanz und statische Variablen (Klassenvariablen) sind Variablen für jede Klasse. ** **.

Sample.java


class Sample {
  int number = 99; //Instanzvariable
  static String color = "Gelb"; //statische Variable (Klassenvariable)

  //Eine Methode zum Festlegen eines Werts in einer statischen Variablen (Klassenvariable)
  public void setColor(String value) {
    color = value;
  }
}

Daher kann darauf zugegriffen werden, ohne die Klasse zu instanziieren. Klassenname.Statische Variable (Klassenvariable) Name

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("rot");
    System.out.println(Sample.color); //rot

    Sample sample2 = new Sample();
    //Da die Zahl, bei der es sich um eine Instanzvariable handelt, für jedes Objekt gespeichert wird, ist der Anfangswert 99 enthalten.
    System.out.println(sample2.number); // 99

    //statische Variable (Klassenvariable)Weil die Farbe von einen gemeinsamen Wert hat
    //Der Standardwert "gelb" ist sample1.Rot wurde zum Zeitpunkt von setColor eingestellt.
    //Wenn Sie hier auf die statische Variable (Klassenvariable) zugreifen, wird sie daher rot ausgegeben.
    System.out.println(Sample.color); //rot
  }
}

Da statische Variablen (Klassenvariablen) allgemeine Variablen der Klasse sind, wirken sich Änderungen auf alle verwendeten Teile aus.

Zeitpunkt für die Verwendung statischer Variablen (Klassenvariablen)

Beispiel) Wenn Sie Daten darüber speichern möchten, wie viele Personen erstellt wurden.

Human.java


class Human {
  //Instanzvariable
  String name;

  //statische Variable(Klassenvariable)
  static int count = 0;

  //Statische Variablen bei Instanziierung(Klassenvariable)Zu+Ich mache
  Human() {
    count++;
  }

  public static void humanCount() {
    //Überprüfen Sie, wie viele Personen erstellt wurden
    System.out.println(count + "Person erstellt");
  }
}

Main.java


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

    //Statische Variablen ausgeben (Klassenvariablen)
    System.out.println(Human.count); // 1

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

    //Statische Variablen ausgeben (Klassenvariablen)
    System.out.println(Human.count); // 2

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

    //Statische Variablen ausgeben (Klassenvariablen)
    System.out.println(Human.count); // 3

    Human.humanCount(); //Ausgabe, dass 3 Personen erstellt wurden
  }
}

Am Ende

Ich habe den Umfang von Variablen kennengelernt.

** Wenn Sie programmieren, ohne den Umfang zu kennen ... ** ・ Fehler kann auftretenSie können einer Variablen an einer unbeabsichtigten Stelle einen Wert zuweisen (er wurde zugewiesen, obwohl Sie nicht beabsichtigten, ihn zuzuweisen)

Dies kann zu Problemen wie unerwarteten Bewegungen führen.

Ich denke, dass die oben genannten Probleme verhindert werden können, indem sie unter Berücksichtigung des Einflussbereichs des Anwendungsbereichs implementiert werden.

Das nächste Mal werde ich mich mit der Funktionsweise von Zeichenketten befassen (in Vorbereitung).

Recommended Posts

[Einführung in Java] Variablenbereich (Bereich, lokale Variable, Instanzvariable, statische Variable)
[Einführung in Java] Informationen zu Variablen und Typen (Variablendeklaration, Initialisierung, Datentyp)
Java-Variablenbereich (Bereich)
Java-Variablenbereich
[Java] Einführung in Java
[Einführung in Java] Informationen zu Variablendeklarationen und -typen
Einführung in Java
Einführung in den Java-Befehl
Java-Variablenbereich (Bereich, in dem Variablen angezeigt werden)
[Java Silver] Was sind Klassenvariablen, Instanzvariablen und lokale Variablen?
Übergeben Sie Variablen an Scope.
[Java] Einführung in den Lambda-Ausdruck
[Java] Gründe für die Verwendung von statischen
Verwendung von Java-Variablen
[Java] Einführung in die Stream-API
[Einführung in Janken (ähnliche) Spiele] Java
[Einführung in Java] Über Lambda-Ausdrücke
[Einführung in Java] Informationen zur Stream-API
Einführung in die funktionale Programmierung (Java, Javascript)
[Verarbeitung × Java] Verwendung von Variablen
So schreiben Sie eine Java-Variablendeklaration
Erste Einführung in Mac (Java-Ingenieur)
Weisen Sie Java-Variablen Bewertungsergebnisse zu
So benennen Sie Variablen in Java
[Grundkenntnisse in Java] Umfang der Variablen
Lokale Java-Variablen sind threadsicher
Einführung in Java zum ersten Mal # 2
Einführung in die Programmierung für Studenten: Variablen
Unterschied zwischen Ruby-Instanzvariable und lokaler Variable
Punkt 57 Minimieren Sie den Umfang lokaler Variablen
Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
[Einführung in Java] So schreiben Sie ein Java-Programm
Punkt 57: Minimieren Sie den Umfang lokaler Variablen
[Java] Unterschiede zwischen Instanzvariablen und Klassenvariablen
Kotlin-Scope-Funktionen zum Senden an Java-Entwickler
Ausgabe des Buches "Einführung in Java"
Einführung in Algorithmen mit Java --Search (Breitenprioritätssuche)
statische Variable
Java statisch
[Java] Einführung
Konzept der Instanz ・ Klassentypvariable ・ Konstruktor ・ Statisches Element
[Einführung in Java] Informationen zur Typkonvertierung (Besetzung, Promotion)
Einführung in Algorithmen mit Java --Search (Bit Full Search)
Road to Java Engineer Teil 1 Einführung & Umgebungskonstruktion
Informationen zu in Java verwendeten Variablen (lokaler Variablentyp)
[Monatlich 2017/04] Einführung in groovy !! ~ Java Grammatik / Spezifikationsvergleich ~
Erste Schritte mit Groovy für problematische Java-Ingenieure
[Einführung in Java] Grundlagen der Java-Arithmetik (für Anfänger)