JavaRush /Java-Blog /Random-DE /Final, Konstanten und Unveränderlich in Java

Final, Konstanten und Unveränderlich in Java

Veröffentlicht in der Gruppe Random-DE
Hallo! Das Wort „Modifikator“ ist Ihnen bereits bekannt. Zumindest sind Sie auf Zugriffsmodifikatoren (öffentlich, privat) und den statischen Modifikator gestoßen. Heute sprechen wir über den speziellen Endmodifikator . Man kann sagen, dass es die Bereiche unseres Programms „festigt“, in denen wir ein konstantes, eindeutiges und unveränderliches Verhalten benötigen. Es kann in drei Bereichen unseres Programms verwendet werden: Klassen, Methoden und Variablen. Unveränderlich in Java: endgültig, Konstanten und unveränderlich – 2 Gehen wir sie einzeln durch. Wenn eine Klassendeklaration den finalen Modifikator enthält , bedeutet dies, dass Sie nicht von dieser Klasse erben können. In früheren Vorlesungen haben wir ein einfaches Beispiel für Vererbung gesehen: Wir hatten eine übergeordnete Klasse Animalund zwei untergeordnete Klassen – CatundDog
public class Animal {
}

public class Cat extends Animal {
   //..поля и методы класса Cat
}

public class Dog extends Animal {

   //..поля и методы класса Dog
}
Wenn wir jedoch Animaleinen Modifikator für eine Klasse angeben final, können Klassen Catauch nicht von dieser erben Dog.
public final class Animal {

}

public class Cat extends Animal {

   //ошибка! Cannot inherit from final Animal
}
Der Compiler erzeugt sofort einen Fehler. Es gibt viele -Klassen, die bereits in Java implementiert sind final. Das bekannteste davon, das Sie ständig verwenden, ist String. Wenn eine Klasse außerdem als deklariert wird final, werden auch alle ihre Methoden zu final. Was bedeutet das? Wenn für eine Methode ein Modifikator angegeben ist final, kann diese Methode nicht überschrieben werden. Wir haben zum Beispiel eine Klasse, Animaldie eine Methode definiert voice(). Allerdings „reden“ Hunde und Katzen eindeutig unterschiedlich. Daher werden wir in jeder der Klassen - Catund Dog- eine Methode erstellen voice(), diese jedoch unterschiedlich implementieren.
public class Animal {

   public void voice() {
       System.out.println("Stimme!");
   }
}

public class Cat extends Animal {

   @Override
   public void voice() {
       System.out.println("Miau!");
   }
}

public class Dog extends Animal {

   @Override
   public void voice() {
       System.out.println("Schuss!");
   }
}
In den Klassen Catund Doghaben wir die Methode der übergeordneten Klasse überschrieben. Jetzt wird das Tier je nachdem, um welches Klassenobjekt es sich handelt, vokalisieren:
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       Dog dog = new Dog();

       cat.voice();
       dog.voice();
   }
}
Fazit: Miau! Schuss! Wenn wir jedoch eine Methode in einer Klasse als Animaldeklarieren , ist es nicht möglich, sie in anderen Klassen neu zu definieren: voice()final
public class Animal {

   public final void voice() {
       System.out.println("Stimme!");
   }
}


public class Cat extends Animal {

   @Override
   public void voice() {//ошибка! final-метод не может быть переопределен!
       System.out.println("Miau!");
   }
}
Dann werden unsere Objekte gezwungen, die Methode zu verwenden, voice()wie sie in der übergeordneten Klasse definiert ist:
public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   cat.voice();
   dog.voice();
}
Fazit: Stimme! Stimme! Nun zu finalden -Variablen. Ansonsten heißen sie Konstanten . Erstens (und am wichtigsten) kann der erste einer Konstante zugewiesene Wert nicht geändert werden. Es ist ein für alle Mal vergeben.
public class Main {

   private static final int CONSTANT_EXAMPLE = 333;

   public static void main(String[] args) {

       CONSTANT_EXAMPLE = 999;//ошибка! Нельзя присвоить новое Bedeutung final-переменной!
   }
}
Die Konstante muss nicht sofort initialisiert werden. Dies kann später erfolgen. Aber der zuerst zugewiesene Wert bleibt für immer bestehen.
public static void main(String[] args) {

   final int CONSTANT_EXAMPLE;

   CONSTANT_EXAMPLE = 999;//так делать можно
}
Zweitens achten Sie auf den Namen unserer Variablen. Für Java-Konstanten gilt eine andere Namenskonvention. Dies ist nicht der CamelCase, den wir gewohnt sind. Im Falle einer regulären Variablen würden wir sie „constantExample“ nennen, aber die Namen der Konstanten werden in Großbuchstaben geschrieben und zwischen den Wörtern (falls es mehrere davon gibt) steht ein Unterstrich – „CONSTANT_EXAMPLE“. Warum werden Konstanten benötigt? Sie sind beispielsweise nützlich, wenn Sie in einem Programm ständig einen konstanten Wert verwenden. Nehmen wir an, Sie haben beschlossen, in die Geschichte einzugehen und das Spiel „The Witcher 4“ alleine zu schreiben. Das Spiel wird natürlich ständig den Namen der Hauptfigur verwenden – „Geralt von Riva“. Es ist besser, diese Zeile und die Namen anderer Helden in einer Konstante zu trennen: Der benötigte Wert wird an einem Ort gespeichert, und Sie werden definitiv keinen Fehler machen, wenn Sie ihn zum millionsten Mal eingeben.
public class TheWitcher4 {

   private static final String GERALT_NAME = "Геральт из Ривии";
   private static final String YENNEFER_NAME = "Йеннифэр из Венгерберга";
   private static final String TRISS_NAME = "Трисс Меригольд";

   public static void main(String[] args) {

       System.out.println("Ведьмак 4");
       System.out.println("Это уже четвертая часть Ведьмака, а " + GERALT_NAME + " ниWie не определится кто ему" +
               " нравится больше: " + YENNEFER_NAME + " oder " + TRISS_NAME);

       System.out.println("Но если вы никогда не играли в Ведьмака - начнем сначала.");
       System.out.println("Главного героя зовут " + GERALT_NAME);
       System.out.println(GERALT_NAME + " - ведьмак, охотник на чудовищ");
   }
}
Abschluss:
Ведьмак 4
Это уже четвертая часть Ведьмака, а Геральт из Ривии ниWie не определится, кто ему нравится больше: Йеннифэр из Венгерберга oder Трисс Меригольд.
Но если вы никогда не играли в Ведьмака — начнем сначала.
Главного героя зовут Геральт из Ривии
Геральт из Ривии — ведьмак, охотник на чудовищ
Wir haben die Namen der Zeichen in Konstanten aufgeteilt und werden sie jetzt definitiv nicht mehr falsch schreiben und müssen sie nicht jedes Mal von Hand schreiben. Ein weiterer Pluspunkt: Wenn wir irgendwann den Wert einer Variablen im gesamten Programm ändern müssen, reicht es aus, dies an einer Stelle zu tun, anstatt es manuell im gesamten Code zu wiederholen :)

Unveränderliche Typen

Während Ihrer Zeit in Java sind Sie wahrscheinlich bereits daran gewöhnt, dass der Programmierer den Zustand aller Objekte fast vollständig kontrolliert. Gesucht – ein Objekt erstellt Cat. Wenn ich wollte, habe ich es umbenannt. Wenn er wollte, änderte er sein Alter oder etwas anderes. Aber in Java gibt es mehrere Datentypen, die einen besonderen Zustand haben. Sie sind unveränderlich oder unveränderlich . Das heißt, wenn eine Klasse unveränderlich ist, kann der Zustand ihrer Objekte nicht geändert werden. Beispiele? Sie werden vielleicht überrascht sein, aber das berühmteste Beispiel der Immutable- Klasse ist String! Es scheint, dass wir den Wert einer Zeichenfolge nicht ändern können? Lass es uns versuchen:
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   str1 = "I love Python";//но поведение str1 ниWie не влияет на str2
   System.out.println(str2);//str2 продолжает указывать на строку "I love Java", хотя str1 уже указывает на другой ein Objekt
}
Fazit: Ich liebe Java. Ich liebe Java. Nachdem wir geschrieben haben:
str1 = "I love Python";
Das Objekt mit der Zeichenfolge „I love Java“ hat sich nicht verändert und ist nirgendwo hingegangen. Es existiert sicher und enthält genau den gleichen Text wie zuvor. Code:
str1 = "I love Python";
habe gerade ein anderes Objekt erstellt und jetzt str1zeigt die Variable darauf. Aber wir können das „Ich liebe Java“ -Objekt in keiner Weise beeinflussen . Okay, versuchen wir es mal anders! Die Klasse Stringist voller Methoden und einige davon scheinen den Status der Zeile zu ändern! Es gibt zum Beispiel eine Methode replace(). Lassen Sie uns in unserer Zeile das Wort „Java“ in das Wort „Python“ ändern!
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   str1.replace("Java", "Python");//попробуем изменить состояние str1, заменив слово "Java" на “Python”
   System.out.println(str2);
}
Fazit: Ich liebe Java, ich liebe Java. Es hat wieder nicht geklappt! Vielleicht funktioniert die Kurvenmethode nicht? Versuchen wir es mit einem anderen. Zum Beispiel, substring(). Schneidet eine Zeichenfolge basierend auf der Anzahl der übertragenen Zeichen zu. Kürzen wir unsere auf die ersten 10 Zeichen:
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   str1.substring(10);//обрезаем исходную строку
   System.out.println(str2);
}
Fazit: Ich liebe Java. Ich liebe Java. Unveränderlich in Java: endgültig, Konstanten und unveränderlich – 3 Es hat sich nichts geändert. Und das hätte auch nicht der Fall sein sollen. Wie gesagt, Objekte Stringsind unveränderlich. Was sind dann all diese Klassenmethoden String? Sie können die Zeile kürzen, die darin enthaltenen Zeichen ändern usw. Warum werden sie dann benötigt, wenn nichts passiert? Sie können! Sie geben jedoch jedes Mal ein neues String-Objekt zurück. Es hat keinen Sinn zu schreiben:
str1.replace("Java", "Python");
- Sie werden das Originalobjekt nicht verändern. Wenn Sie jedoch das Ergebnis der Methode in eine neue Referenzvariable schreiben, werden Sie den Unterschied sofort sehen!
public static void main(String[] args) {

   String str1 = "I love Java";

   String str2 = str1;//обе переменные-ссылки указывают на одну строку.
   System.out.println(str2);

   String str1AfterReplacement =  str1.replace("Java", "Python");
   System.out.println(str2);

   System.out.println(str1AfterReplacement);
}
Nur so Stringfunktionieren alle diese Methoden. Mit dem Objekt „Ich liebe Java“ kann man nichts anfangen . Erstellen Sie einfach ein neues Objekt und schreiben Sie: „Neues Objekt = das Ergebnis einiger Manipulationen mit dem „Ich liebe Java“ -Objekt .“ Welche anderen Typen sind unveränderlich? Was Sie sich jetzt unbedingt merken müssen: Alle Wrapper-Klassen über primitiven Typen sind unveränderlich. Integer, Byte, Character, Short, Boolean, Long, Double, Float– alle diese Klassen erstellen unveränderliche Objekte. Dazu gehören auch Klassen, die zum Erzeugen großer Zahlen verwendet werden – BigIntegerund BigDecimal. Wir haben kürzlich die Ausnahmen durchgesehen und Folgendes angesprochen StackTrace: Also: Objekte der Klasse java.lang.StackTraceElement sind ebenfalls unveränderlich. Das ist logisch: Wenn jemand die Daten auf unserem Stapel ändern könnte, könnte dies die gesamte Arbeit damit zunichte machen. Stellen Sie sich vor, jemand geht in StackTrace und ändert OutOfMemoryError in FileNotFoundException . Und Sie sollten mit diesem Stack arbeiten und nach der Fehlerursache suchen. Und das Programm verwendet überhaupt keine Dateien :) Daher wurden diese Objekte sicherheitshalber unveränderlich gemacht. Nun, mit StackTraceElement ist es mehr oder weniger klar. Warum sollte jemand Strings unveränderlich machen wollen? Was wäre das Problem, wenn es möglich wäre, ihre Werte zu ändern? Es wäre wahrscheinlich noch bequemer :/ Dafür gibt es mehrere Gründe. Erstens, Speicher sparen. Es können unveränderliche Zeichenfolgen eingefügt String Poolund jedes Mal dieselben verwendet werden, anstatt neue zu erstellen. Zweitens Sicherheit. Beispielsweise sind die meisten Logins und Passwörter in jedem Programm Zeichenfolgen. Die Möglichkeit, sie zu ändern, könnte zu Problemen bei der Autorisierung führen. Es gibt noch andere Gründe, auf die wir beim Erlernen von Java jedoch noch nicht eingegangen sind – wir kommen später darauf zurück.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION