Unerwartet unbekannte Java-Zusammenfassung für reservierte Wörter

Überblick

Von Java reservierte Wörter reichen von denen, die Sie häufig sehen, bis zu denen, die Sie nicht sehr oft sehen. Ich werde kurz die seltenen zurückhaltenden Wörter vorstellen, die ich aufgrund meines eigenen Urteils und meiner Vorurteile gewählt habe.

Ich werde nicht zu sehr auf jedes Detail eingehen, damit es nicht zu lang wird.

Gemäß den Java-Sprachspezifikationen werden "reservierte Wörter" als "Schlüsselwörter" bezeichnet. Ich bin der Meinung, dass "reservierte Wörter" häufiger vorkommen, daher werde ich in diesem Artikel den Begriff "reservierte Wörter" verwenden.

Zielgruppe

Java Anfänger Es kann denjenigen bekannt sein, die mit Java bis zu einem gewissen Grad vertraut sind (Präventionslinie)

Umgebung

Java11

Liste der reservierten Wörter in Java

Schauen wir uns zunächst die Liste der reservierten Wörter an. Gemäß der offiziellen Sprachspezifikation gibt es ab Java 11 51 reservierte Wörter wie folgt. https://docs.oracle.com/javase/specs/jls/se11/html/jls-3.html#jls-3.9

abstract   continue   for          new         switch
assert     default    if           package     synchronized
boolean    do         goto         private     this
break      double     implements   protected   throw
byte       else       import       public      throws
case       enum       instanceof   return      transient
catch      extends    int          short       try
char       final      interface    static      void
class      finally    long         strictfp    volatile
const      float      native       super       while
_ (underscore)

Ich werde einige davon aufgreifen und vorstellen.

Reserviertes Wort (Schlüsselwort)

assert Ein reserviertes Wort für die Verwendung von Assertion in Java. Ein Ausdruck beschreibt die Voraussetzungen, die beim Ausführen eines Programms erfüllt sein sollten, und ohne Angst vor Missverständnissen scheint es ein Mechanismus zu sein, um zu überprüfen, ob der Wert einer Variablen ein unerwarteter Wert ist usw. Es ist eine Sache.

Schreiben Sie nach dem Aktivieren einen bedingten Ausdruck. Wenn der Auswertungswert des bedingten Ausdrucks falsch ist, wird ein AssertionError ausgelöst. Beispielsweise kann damit überprüft werden, ob der Wert des Arguments der Methode der erwartete Wert ist.

//Teilung
private int divide(int x, int y) {
    assert y != 0;  //Y darf nicht 0 sein, da es sich um eine Division handelt

    return x / y;
}

Außerdem werden Asserts nur wirksam, wenn Sie zur Laufzeit -enableassertions (oder -ea) angeben. Sie können es aktivieren oder deaktivieren, indem Sie die obige Option übergeben. Es kann während der Entwicklung aktiviert und während der Produktion deaktiviert werden.

const In der Sprache C usw. ist es ein reserviertes Wort zum Deklarieren einer Konstanten, in Java ist es ein reserviertes Wort, das keine Bedeutung hat. Es hat nichts zu bedeuten, aber es existiert aus irgendeinem Grund als reserviertes Wort. Die Verwendung von const hat keine syntaktische Bedeutung und führt zu einem Kompilierungsfehler.

Beachten Sie, dass Sie final anstelle von const verwenden sollten, um eine Konstante in Java zu deklarieren.

//Da es sich um ein reserviertes Wort handelt, erfolgt die Syntaxhervorhebung
const int num = 1;
//Error:
//Unzulässiger Ausdrucksbeginn
//  const int num = 1;
//  ^

default Es ist ein seltenes reserviertes Wort, das mehrfach verwendet wird. Es wurde hinzugefügt, als die Version stieg.

Beispiel für eine Switch-Anweisung

switch(i) {
    case 1:
        System.out.println("einer");
        break;
    case 2:
        System.out.println("zwei");
        break;
    default:
        System.out.println("Andere");
}

Anmerkungsbeispiel

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Range {

    int min() default Integer.MIN_VALUE;

    int max() default Integer.MAX_VALUE;
}

Beispiel für die Standardmethode der Schnittstelle

public interface Person {
    default String name() {
        return "unknown";
    }
}

goto In der Sprache C usw. ist es ein reserviertes Wort, mit dem die Steuerung an einen beliebigen Ort übersprungen wird. Wie bei const handelt es sich jedoch um ein reserviertes Wort, das existiert, obwohl es in Java keine Bedeutung hat. Java hat keine Funktion, die goto entspricht. Der Missbrauch von goto kann die Lesbarkeit des Quellcodes erheblich beeinträchtigen, sodass in relativ modernen Sprachen häufig keine gleichwertige Funktionalität vorhanden ist.

Wie bei const handelt es sich natürlich bei der Verwendung um einen Kompilierungsfehler.

//Immerhin ist die Syntaxhervorhebung abgeschlossen
goto label;
//Error:
//Unzulässiger Ausdrucksbeginn
//  goto label;
//  ^

native Ein reserviertes Wort, das angibt, dass der Inhalt der Methode in einer Muttersprache wie C implementiert ist. Es wird mit JNI usw. ausgeführt.

public native boolean createDirectory(File f);

strictfp Dies ist ein reserviertes Wort, um zu verhindern, dass sich das Ergebnis der Gleitkommaberechnung abhängig von der Ausführungsumgebung ändert (sodass das Ergebnis in allen Ausführungsumgebungen gleich ist). Qualifizieren Sie Methoden und Klassen. Wenn Sie sich dagegen nicht mit strictfp qualifizieren, kann sich das Ergebnis der Gleitkommaberechnung je nach Ausführungsumgebung ändern.

Persönlich habe ich noch nie gesehen, dass es tatsächlich verwendet wird.

private strictfp double calc(double x, double y) {
    return x * y;
}

transient Qualifizierte Felder unterliegen keiner Serialisierung. Serialisierung ist die Konvertierung des Inhalts eines Objekts, damit es in einer Datei gespeichert oder an einen anderen Computer gesendet werden kann. Durch die Qualifizierung mit transient wird das relevante Feld aus den serialisierten Daten ausgeschlossen.

public class Person implements Serializable {
    private String firstName;
    private String lastName;
    private transient String fullName;
}

volatile Unterdrückt die Optimierung von Single-Threaded-Annahmen für qualifizierte Felder. Ich bin sicher, einige von Ihnen haben es gesehen, wissen aber nicht, was es bedeutet. Ich bin mir auch nicht sicher. </ s>

Wenn der Compiler nicht für flüchtig qualifiziert ist, gibt er möglicherweise Bytecodes aus, die sich geringfügig von der Quelle für die Optimierung unterscheiden. Volatile unterdrückt diese Optimierung jedoch. Im Fall eines einzelnen Threads gibt es keinen besonderen Effekt, aber im Fall eines Multithreads kann die Optimierung durch den Compiler zu Inkonsistenzen führen. Volatile wird verwendet, um das Auftreten solcher Inkonsistenzen zu verhindern.

volatile boolean shutdownRequested;
 
...
 
public void shutdown() { shutdownRequested = true; }
 
public void doWork() { 
    while (!shutdownRequested) { 
        // do stuff
    }
}

Von https://www.ibm.com/developerworks/jp/java/library/j-jtp06197.html

Im obigen Beispiel erwarten wir, dass shutdown () aus der Schleife ausbricht, wenn es von einem anderen Thread aufgerufen wird, aber es funktioniert möglicherweise nicht wie erwartet, es sei denn, shutdownRequested ist mit volatile qualifiziert.

… Es sollte sein, aber als ich es tatsächlich ausprobierte, funktionierte es normal, auch ohne flüchtig. Bitte sagen Sie mir, wer damit vertraut ist! </ font>

_(underscore) In Sprachen wie Scala wird _ für Platzhalter usw. verwendet, Java verfügt jedoch nicht über eine solche Funktion. Wie const und goto ist es ein bedeutungsloses reserviertes Wort (Symbol?). _ Wurde vor relativ kurzer Zeit mit Java 9 zu einem reservierten Wort und kann zukünftige Verbesserungen vorwegnehmen.

int _ = 1;
//Error:
//Ab Release 9'_'Ist ein Schlüsselwort und kann nicht als Bezeichner verwendet werden
//  int _ = 1;
//      ^

Sonderedition

Reservierte Wörter, die einmal existierten

widefp Im Gegensatz zu strictfp wird das Gleitkommaberechnungsergebnis umgebungsabhängig. Widefp wurde entfernt, da es sich jetzt standardmäßig so verhält.

Etwas, das wie ein reserviertes Wort aussieht, aber kein reserviertes Wort ist

wörtlich

richtig und falsch

Es ist ein bekanntes boolesches Literal. Tatsächlich sind dies keine reservierten Wörter in der Java-Sprachspezifikation. Nun, es kann nicht als Bezeichner verwendet werden, also ist es eigentlich wie ein reserviertes Wort.

null Es ist ein bekanntes Null-Literal. Wie das boolesche Literal kann es nicht als Bezeichner verwendet werden, ist jedoch kein reserviertes Wort in den Sprachspezifikationen.

Eingeschränktes Schlüsselwort

open, module, requires, transitive, exports, opens, to, uses, provides, with Beide wurden in Java 9 für die Modulfunktionalität hinzugefügt. Wenn Sie jedes einzelne aufheben, wird es lang sein und ich verstehe es nicht gut </ s>, daher werde ich die Erklärung weglassen. Beide Wörter haben eine besondere Bedeutung, können jedoch als Variablennamen verwendet werden. Wahrscheinlich aus Kompatibilitätsgründen.

String module = "module";

Reservierter Typname

var Wird für die von Java 10 hinzugefügte Typinferenzfunktion verwendet. Dies hat auch eine spezielle Bedeutung wie die oben genannten "eingeschränkten Schlüsselwörter", kann jedoch als Variablenname usw. verwendet werden. Dies ist möglicherweise kein reserviertes Wort für die Kompatibilität.

var var = 1;

Zusammenfassung

Ich habe viele Dinge gesehen, von reservierten Java-Wörtern bis hin zu Dingen, die wie reservierte Wörter aussehen, aber keine reservierten Wörter sind. Ich würde mich freuen, wenn Sie denken könnten, dass es so etwas gibt.

Referenzlink

https://docs.oracle.com/javase/specs/jls/se11/html/jls-3.html#jls-3.9 https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89_(Java) https://java.keicode.com/lang/assert.php https://www.wdic.org/w/TECH/strictfp https://www.ibm.com/developerworks/jp/java/library/j-jtp06197.html https://www.wdic.org/w/TECH/%E4%BA%88%E7%B4%84%E8%AA%9E%20%28Java%29