Konstanten

„Amigo, wusstest du, dass in Java nicht alle Variablen geändert werden können?“

„Wie ist das, Kim? Tatsächlich spricht schon das Wort ‚Variable‘ von Veränderung.“

„Daran besteht kein Zweifel. Wie viele andere Programmiersprachen gibt es in Java Konstanten , also Variablen, deren Werte nicht geändert werden können . Und das Wort ‚Konstante‘ spricht schon von Konstanz.“

„Und wofür sind sie?“

„Normalerweise werden sie für eine grundlegende Sache verwendet, beispielsweise für die Anzahl Pioder die Anzahl der Tage in den Monaten eines Jahres. Allerdings kann ein Programmierer im Prinzip jede Variable zu einer Konstante machen, wenn er oder sie sich dazu entschließt.“ so ist es notwendig.“

„Du meinst etwa einen Namen, die Farbe eines Autos oder den Namen eines Wochentags?“

„Sie haben die richtige Idee. Alles, was nicht geändert werden sollte.“

„Und wie sehen diese Konstanten in Java aus?“

„Java hat ein spezielles Schlüsselwort für sie: 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;

„Was passiert, wenn Sie eine Konstante erstellen und dann versuchen, ihr einen anderen Wert zuzuweisen?“

„Das ist die richtige Frage! Und die richtige Antwort lautet: Wenn Sie versuchen, einer finalVariablen einen anderen Wert zuzuweisen, lässt sich Ihr Programm einfach nicht kompilieren.“

„Was ist, wenn Sie eine finalVariable deklarieren, ihr aber keinen Wert zuweisen?“

„Das macht keinen Sinn, deshalb ist es in Java auch nicht erlaubt. Eine finalVariable muss initialisiert werden, wenn sie deklariert wird, das heißt, Sie müssen ihr einen Wert zuweisen. Es gibt eine Ausnahme von dieser Regel: Sie können die Initialisierung von verschieben eine statische Klassenvariable in einen Konstruktor. Aber das erfahren Sie später.

„Allerdings ist nicht alles, was ist, finaleine Konstante. Um die Anzahl der Schlüsselwörter zu reduzieren, verwenden Java-Entwickler das Wort finalnicht nur für die Deklaration von Konstanten. finalEs kann auch auf Methoden und sogar Klassen angewendet werden. Deklarierte Methoden finalkönnen nicht überschrieben werden, und eine Klasse. “ als finalnicht vererbbar deklariert.“

„Äh... Überschrieben? Vererbt? Welche Sprache sprichst du jetzt?“

„Die Sprache der objektorientierten Programmierung. Sie werden sich sehr bald damit befassen. Bis dahin genießen Sie einfach die schöne Terminologie.“

„Okay. Kann also finalvor Variablen, Klassen und Methoden stehen, und dieses Schlüsselwort macht sie in gewissem Sinne unveränderlich?“

"Ja. Darüber hinaus finalkann der Modifikator vor allen Variablen hinzugefügt werden: lokale Variablen, Methodenparameter, Klassenfelder und statische Klassenvariablen.

„Hier ist es wichtig, sich daran zu erinnern: finalBevor ein Variablenname nur ein Schutz vor Änderungen an dieser Variablen ist . Wenn eine Variable einen Verweis auf ein Objekt speichert, kann das Objekt trotzdem geändert werden.“

„Ich verstehe es nicht ganz.“

„Sie werden es sehr bald verstehen. Hier ein 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.

„Verstanden. Das ist schwierig.“

Globale Konstanten

„Was sind Ihrer Meinung nach globale Konstanten?“

„Ich vermute, globale Konstanten sind wahrscheinlich wie globale Variablen, nur Konstanten?“

„Genau. Wenn Sie in Ihrem Programm globale Konstanten deklarieren müssen, erstellen Sie statische Klassenvariablen und machen Sie sie publicund final. Es gibt einen besonderen Stil für die Namen solcher Variablen: Sie werden in Großbuchstaben geschrieben, üblicherweise mit einem Unterstrich getrennte Wörter.

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

Variable Beschattung

„Wie ich bereits sagte, können Sie in einer einzigen Methode nicht mehrere lokale Variablen mit demselben Namen erstellen. In verschiedenen Methoden ist dies möglich.“

"Ich weiß, dass!"

„Aber was Sie wahrscheinlich nicht wissen, ist, dass Variablen in einer Klasse und lokale Variablen in einer Methode durchaus denselben Namen haben können.

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, sum
count, sum
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 verdeckt (oder maskiert ) sie die sumInstanzvariable.“

„Hmm... ich würde sagen, in gewisser Weise ist das das erwartete Verhalten.“

„Aber das ist noch nicht das Ende der Geschichte. Es stellt sich heraus, dass es, wenn eine Instanzvariable durch eine lokale Variable überschattet wird, immer noch eine Möglichkeit gibt, innerhalb der Methode auf die Instanzvariable zu verweisen. Wir tun dies, indem wir das Schlüsselwort vor ihren Namen schreiben. this“ :

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.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

Die Variablen countund sumsind ü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

„Natürlich muss ich das üben.“

„Du wirst es schaffen.“

„Was ist, wenn eine statische Klassenvariable geschattet wird und nicht nur eine (nicht statische) Instanzvariable? Sie können nicht über darauf zugreifen this?“

„Sie haben Recht. Das Schlüsselwort this funktioniert nicht. Sie müssen über den Klassennamen darauf verweisen:

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

„Achtung: Sie können auf die statischen Variablen countund sumüberall mit oder ohne Verwendung des Klassennamens Solutionals Präfix zugreifen. In den Zeilen, in denen die sumlokale Variable die sumInstanzvariable überschattet, ist der Zugriff auf die sumKlassenvariable nur möglich, wenn sie Solutionals Präfix verwendet wird.

Variablen innerhalb einer forSchleife

„Und noch eine kleine, aber interessante Tatsache. Es gibt auch einen Ort, an dem eine Variable auf besondere Weise deklariert wird – ich spreche von innerhalb einer forSchleife .“ Normalerweise forenthält eine Schleife eine counterVariable in Klammern. 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?"

„Davon habe ich schon etwas gehört. Soweit ich weiß, ist eine im Schleifenkopf deklarierte Variable nur forim Schleifenkörper und im Schleifenkopffor sichtbar .“

„Gut gemacht, Amigo. Schauen Sie sich dennoch ein Beispiel an, um dieses Material zu untermauern:

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 sagen also, dass ich in meinem Code mehrere Schleifen nacheinander mit einer gleichnamigen Zählervariablen schreiben könnte und es keine Probleme geben würde?“

„Es würde keine Probleme geben. Schauen Sie hier:

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