1. Konstanten

Viele andere Programmiersprachen haben Konstanten , also Variablen, deren Werte nicht geändert werden können . Normalerweise werden sie für eine grundlegende Sache verwendet, beispielsweise für die Anzahl Pioder die Anzahl der Tage in den Monaten des Jahres. Allerdings kann ein Programmierer im Prinzip jede Variable in eine Konstante umwandeln, wenn er oder sie dies für notwendig hält.

Wie deklariert man also eine unveränderliche Variable (Konstante) in Java? Dafür gibt es ein spezielles Schlüsselwort: final. Das Erstellen einer unveränderlichen Variablen sieht genauso aus wie das Erstellen einer gewöhnlichen Variable. Der einzige Unterschied besteht darin, dass Sie vor dem Typ der Variablen das Wort schreiben müssen final, etwa so:

final Type name = value;

Wenn Sie versuchen, einer Variablen einen anderen Wert zuzuweisen final, lässt sich Ihr Programm einfach nicht kompilieren.

Eine finalVariable muss bei der Deklaration initialisiert (ihr muss ein Wert zugewiesen werden) werden. Von dieser Regel gibt es eine Ausnahme: Sie können die Initialisierung einer statischen Klassenvariablen in einen Konstruktor verschieben. Aber das erfahren Sie in Level 10 .

Um die Anzahl der Schlüsselwörter zu reduzieren, verwenden Java-Entwickler das Wort finalnicht nur für die Deklaration von Konstanten. finalkann auch auf Methoden und sogar Klassen angewendet werden. Als deklarierte Methoden finalkönnen nicht überschrieben werden und eine als deklarierte Klasse finalkann nicht vererbt werden.

Der finalModifikator kann vor allen Variablen hinzugefügt werden: lokale Variablen, Methodenparameter, Klassenfelder und statische Klassenvariablen.

Beachten Sie, dass finalein Variablenname lediglich Schutz vor Änderungen an dieser Variablen darstellt . Wenn eine Variable einen Verweis auf ein Objekt speichert, kann das Objekt trotzdem geändert werden.

Beispiel:

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

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

data[0] = 0;
data[1] = 0;
data[2] = 0;
Wir erstellen ein Array.

Dies ist nicht zulässig: Die dataVariable ist als deklariert final.

Aber Sie können dies tun.
Und auch das.

Globale Konstanten

Wenn Sie sich dazu entschließen, globale Konstanten in Ihrem Programm zu deklarieren, müssen Sie statische Klassenvariablen erstellen und sie publiczu einem machen final. Für die Namen solcher Variablen gibt es einen besonderen Stil: Sie werden in Großbuchstaben geschrieben, wobei zur Trennung der Wörter ein Unterstrichzeichen verwendet wird.

Beispiele:

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;
}


2. Variable Beschattung

Wie bereits erwähnt, können Sie in derselben Methode nicht mehrere lokale Variablen mit demselben Namen erstellen. Auf verschiedene Weise ist dies möglich.

Aber Folgendes wissen Sie wahrscheinlich nicht: Instanzvariablen und lokale Methodenvariablen können denselben Namen haben.

Beispiel:

Code Variable Sichtbarkeit
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
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

In der addMethode haben wir eine lokale Variable mit dem Namen deklariert sum. Bis zum Ende der Methode wird die Instanzvariable beschattet (oder maskiert ) .sum

Okay, sagen Sie, das ist in gewisser Weise zu erwarten. Aber das ist noch nicht das Ende der Geschichte. Es stellt sich heraus, dass es immer noch eine Möglichkeit gibt, innerhalb der Methode auf die Instanzvariable zu verweisen, wenn eine Instanzvariable durch eine lokale Variable überschattet wird. Wir tun dies, indem wir das thisSchlüsselwort vor seinen Namen schreiben:

this.name

Hier ist ein Beispiel, bei dem der Namenskonflikt erfolgreich gelöst wurde:

Code Variable Sichtbarkeit
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.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

Die Variablen count und sum sind überall mit oder ohne das Schlüsselwort verfügbar this. In Zeilen, in denen die lokale Variable die Instanzvariable sum überschattet ,  kann auf die Instanzvariable nur mit dem Schlüsselwort zugegriffen werden.sumsumthis

Wenn eine statische Klassenvariable und nicht eine Instanzvariable geschattet wird, müssen Sie über den Klassennamen und nicht über das thisSchlüsselwort darauf zugreifen:

ClassName.name

Beispiel:

Code Variable Sichtbarkeit
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

Sie können überall auf die count und sum statischen Variablen zugreifen, mit oder ohne Verwendung des Klassennamens Solutionals Präfix. In den Zeilen, in denen die lokale Variable die Instanzvariable sumüberschattet ,  ist der Zugriff auf die Instanzvariable nur bei Verwendung als Präfix möglich.sumsumSolution



3. Variablen innerhalb einer forSchleife

Und noch eine kleine, aber interessante Tatsache.

Es gibt auch eine Stelle, an der eine Variable auf besondere Weise deklariert wird – innerhalb einer forSchleife .

Sie erinnern sich vielleicht, dass eine forSchleife normalerweise eine Zählervariable in Klammern hat. Und wie wird die Sichtbarkeit dieser Variable sein? Schließlich befindet es sich nicht im Hauptteil der Schleife. Ist es die ganze Methode? Oder nicht?

Die richtige Antwort lautet : Eine im Header einer forSchleife deklarierte Variable ist nur im Schleifenkörper und im Schleifenheaderfor sichtbar .

Beispiel:

Code Variable Sichtbarkeit
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

Sie können also jederzeit Schleifen nacheinander in Ihren Code schreiben und Zählervariablen mit demselben Namen verwenden – das verursacht keine Probleme.

Beispiel:

Code Variable Sichtbarkeit
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