Java-Überprüfung
Ich werde Java zum ersten Mal seit langer Zeit wieder verwenden, daher habe ich zusammengefasst, was ich als Memorandum überprüft habe. Es wäre hilfreich, wenn Sie auf Fehler hinweisen könnten ...
Java-Übersicht
- Entwickelt von Sun Microsystems in den frühen 1990er Jahren
--Sun Microsystems wurde 2010 von Oracle übernommen
- Die Fangkopie lautet "Einmal schreiben, überall ausführen".
- ** Compiler ** konvertiert die Quellcode
.java
Datei in Bytecode .class
, ** JVM ** interpretiert und führt den Bytecode aus
- Anfangs war die Version 1. *, aber jetzt wird sie durch eine Ganzzahl wie 6, 7 und 8 dargestellt.
- 1.0 -> 1.1 -> 2.0 -> 1.3 -> 1.4 -> 5.0 -> 6 -> 7(GAE) -> 8(AWS Lambda)
Objektorientierung
- Ersetzen Sie die tatsächliche Bewegung der Dinge durch das Programm, wie es ist
- Reduziert die Auswirkungen auf vorhandenen Code beim Hinzufügen von Funktionen
- Java-Code besteht aus Klassen, und Klassen bestehen aus Zuständen (Instanzvariablen) und Funktionen (Methoden).
- Erstellen Sie eine Instanz aus einer Klasse
- Methoden sind Instanzen gemeinsam, Instanzvariablen sind eindeutig
- Übergabe von Daten an die Methode (Argument) nach Wert
- Methoden können überladen werden (verschiedene Argumente mit demselben Methodennamen)
- Instanzvariablen haben Standardwerte (keine lokalen Variablen)
- Verhindern Sie die unbefugte Manipulation von Instanzvariablen
- Deklarieren Sie die Instanzvariable mit "privat" und betreiben Sie die Instanz mit der mit "public" deklarierten Getter-Methode und Setter-Methode.
--Erbe
- Erben, wenn die Klasse eine IS-A-Beziehung hat
- Cat is an Animal.
class Cat extends Animal {}
- Es gibt eine Has-A-Beziehung als etwas Ähnliches
- Da die Vererbung in eine Richtung erfolgt, können Methoden der Oberklasse aus Unterklassen verwendet werden, nicht jedoch umgekehrt.
- Überschreiben ermöglicht das Überschreiben von Methoden der Oberklasse
- Verdienst
--DRY: Die Vererbung kann mithilfe einer gemeinsamen Methode in einer Oberklasse aus mehreren Unterklassen dedupliziert werden.
--Polymorphismus: Die Zuweisung von Unterklassen ist möglich, indem beim Deklarieren von Methodenargumenten und -variablen eine Oberklasse als Typ angegeben wird.
- Auch wenn Sie eine neue Unterklasse hinzufügen, ist diese verfügbar, ohne den entsprechenden Code zu ändern.
- Hinweise zur Verwendung von Vererbung - Machen Sie Unterklassen spezifischer als Oberklassen
- Superklassen, die nicht instanziiert werden müssen, werden mit "abstract" in abstrakte Klassen umgewandelt
- Wenn Sie eine Unterklasse zwingen möchten, Logik zu implementieren, verwenden Sie "abstract", um sie zu einer abstrakten Methode zu machen.
- In diesem Fall muss es sich um eine abstrakte Klasse handeln
- Nicht zum Wiederverwenden von Methoden verwenden, verwenden, wenn eine IS-A-Beziehung hergestellt wird
- Die Oberklasse wird zuerst aufgerufen, der Konstruktor der Unterklasse wird später aufgerufen und die Reihenfolge kann nicht geändert werden.
- Java verbietet Mehrfachvererbung, die mehr als eine Klasse erbt
- Wenn mehrere geerbte Oberklassen denselben Methodennamen haben, die Frage, welche priorisiert werden soll
- Es sind jedoch mehrere Implementierungen der Schnittstelle möglich
Object
ist eine Oberklasse aller Klassen
-
Hat gleich, hashCode, getClass, toString als Methoden
--Dies kann überschrieben werden, insbesondere beim Vergleichen von Objekten (gleich, hashCode) und beim Debuggen (toString).
-
Schnittstelle
- Schließen Sie abstrakte Klassen ab, alle Methoden werden zu abstrakten Methoden
- Wird verwendet, um mehreren Klassen in der Vererbungsbeziehung (IS-A-Beziehung) gemeinsame Funktionen hinzuzufügen.
- ArrayList- und HashSet-Klassen haben keine Vererbungsbeziehung, aber beide implementieren eine Iterable-Schnittstelle, die den wiederholten Zugriff auf Elemente ermöglicht.
- Durch Angabe einer Schnittstelle als Methodenargument oder Rückgabetyp kann die Zuweisung einer Instanz der Klasse implementiert werden.
Variable
- Variablen können in primitive Typen (int, double, boolean) und Referenztypen unterteilt werden
- Variablen vom Referenztyp speichern Verweise auf Objekte im Heap-Bereich
- Ein Array mit primitiven Typen (int [] usw.) ist auch eine Referenztypvariable.
- Seien Sie vorsichtig beim Vergleich, "==" für primitiven Typ, "gleich" für Referenztyp ("==", wenn Sie wissen möchten, ob es sich um dieselbe Objektreferenz handelt)
- Variablen können gegossen werden (Typkonvertierung)
--Cast von int nach double ist möglich
--Doppel nach int, um die Behandlung von Brüchen mithilfe der Mathematikbibliothek anzugeben
- Der primitive Typ hat ein entsprechendes Wrapper-Objekt
- Ganzzahlobjekt für den Typ int
- Da Sie in den Generika ein Objekt angeben können, führt "ArrayList " zu einem Kompilierungsfehler und "ArrayList " ist die richtige Typdeklaration.
- Konvertieren Sie den primitiven Typ des Wrapper-Objekts <-> automatisch
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1); //Fügen Sie Daten vom Typ int ein
int i = list.get(o); //Als Variable vom Typ int empfangen
- Jedes Mal, wenn Sie Zeichenfolgen in einer Schleife verketten, wird ein neues Objekt im Zeichenfolgenpool erstellt
- Es wurde darauf hingewiesen, dass der Aufwand für das Erstellen von Objekten und das Problem, dass der String-Pool nicht durch Müll gesammelt wird.
- Die Verkettung mit dem Anhängen von StringBuffer / StringBuilder # wird empfohlen
Zugriffsebene
- Es gibt Public, Private, Default, Protected
- Häufig verwendet werden öffentlich und privat
- Öffentlich: Verfügbar in jedem Code
- Privat: Nur in Ihrer Klasse erhältlich
- Standard: Nur in Ihrer eigenen Paketklasse verfügbar
- Geschützt: Verfügbar in Unterklassen anderer Pakete zusätzlich zur Klasse Ihres eigenen Pakets
Müllabfuhr
- Der von Java verwendete Speicherbereich ist in Stapel und Heap unterteilt.
- Methoden und lokale Variablen (innerhalb von Methoden deklarierte Variablen) werden auf dem Stapel gespeichert
- Wird dem Stapel hinzugefügt, wenn eine Methode eine neue Methode aufruft
- Verlassen Sie den Stapel, wenn die Methode zurückkehrt
- Objekte werden im Heap gespeichert
- Objekte unterliegen der Speicherbereinigung, wenn alle Referenzen weg sind
statisch
- Für statische Methoden ist keine Instanz erforderlich (z. B. Methoden für Mathematikklassen).
- Wenn Sie eine Klasse mit einem Konstruktor von "privat" erstellen, können Sie keine Instanz erstellen.
- In statischen Methoden können Instanzvariablen und normale Methoden nicht verwendet werden, aber statische Variablen können verwendet werden.
--Statische Variablen sind Variablen, die in allen Instanzen der Klasse den gleichen Wert haben
--Konstanten können mit
static final
definiert werden
Ausnahme
- Auslösen einer Ausnahme, um den Benutzer über die Methode zu informieren, dass die Methode unter bestimmten Bedingungen nicht erfolgreich abgeschlossen werden konnte
- Alle Ausnahmen sind Klassenobjekte, die vom Ausnahmetyp erben
- RuntimeException wird eher durch einen Fehler in der Logik des Programms als durch eine unerwartete Situation verursacht.
--NumberFormatException in Integer # parseInt ist darauf zurückzuführen, dass die Argumentzeichenfolge keine Zahl ist, die vor dem Aufruf in der Logik entfernt werden sollte
- Ein Try / Catch-Block ist für Ausnahmen, die RuntimeException erben, nicht erforderlich (nicht aktivierte Ausnahmen).
- Polymorphismus: Wenn Sie eine Ausnahme für den Fang angeben, erhalten Sie alle Ausnahmen.
try {} catch(Exception e) {}
- Nicht empfohlen, aber effektiv, da es im Testcode usw. praktisch ist.
- Die Reihenfolge der catch-Anweisungen ist wichtig. Schreiben Sie daher die obigen Unterklassen
try {
} catch(Cat e) {
} catch(Animal e) {
- Wenn Sie keine Ausnahmen behandeln, können Sie dies vermeiden, indem Sie beim Deklarieren der Methode Würfe angeben.
IO
- Die Schreibmethode von FileWriter greift bei jeder Ausführung auf die Festplatte zu, was zu einer schlechten Leistung führt.
- Beim Schreiben mit BufferedWriter wird eine bestimmte Speichermenge gespeichert. Wenn die Kapazität voll ist, wird das Schreiben ausgeführt, sodass der Festplattenzugriff abnimmt.
--Verwenden Sie flush (), um einen Schreibvorgang zu erzwingen
- Verwenden Sie BufferedReader zum Lesen
Faden
- Teilen Sie die CPU-Zeit, damit mehrere Prozesse gleichzeitig parallel erscheinen
- Um einen Thread zu starten, erstellen Sie ein Objekt einer Klasse, die die Runnable-Schnittstelle implementiert.
- Es gibt drei Thread-Status: ausführbar, Block (Sleep, IO) und Ausführen.
- Jeder Status wird vom Thread-Scheduler verwaltet und festgelegt
- Probleme treten auf, wenn mehrere Threads auf dasselbe Objekt zugreifen
- Das Sperren des Objektzugriffs kann durch Anhängen synchronisiert an die Methode und Begrenzen der Anzahl der Threads, auf die gleichzeitig zugegriffen werden kann, auf einen erfolgen.
- Achten Sie bei der Verwendung auf tote Schlösser
Datenstruktur
- SET: Wird verwendet, wenn es wichtig ist, dass keine doppelten Elemente vorhanden sind
- HashSet, TreeSet
--Dupliziert mit hashCode () und equals (), überschreiben Sie sie daher bei Bedarf
- Liste: Wird verwendet, wenn die Anordnung der Elemente wichtig ist
- Sie können mit Collections.sort sortieren
- Beachten Sie den Unterschied zwischen den folgenden beiden
--Wenn Sie eine Sammlung zuweisen, deren Elemente Instanzen der Oberklasse sind
public void barkAll(ArrayList<Animal> user) {}
- Beim Zuweisen einer Sammlung, deren Elemente Unterklasseninstanzen sind (unter Verwendung von Platzhaltern)
public void barkAll(ArrayList<? extends Animal> user) {}
Paket und Glas
- Stellen Sie gleichnamige Klassen zur Verfügung, indem Sie die Klassen in Pakete aufteilen
- Der Paketname ist normalerweise die Umkehrung der Domain
- Klassendateien können in JAR kombiniert werden
- Sie können eine ausführbare JAR-Datei erstellen, indem Sie in Manifest.txt die Hauptklasse angeben.