--package- und import-Deklarationen gelten für alle Klassen in derselben Datei
Die Paketdeklaration muss am Anfang des Quellcodes stehen (nur Kommentare können vor dem Paket geschrieben werden).
Das Paket java.lang ist eine Sammlung grundlegender Klassen und erfordert keine Importdeklaration
Mit "\ *" werden keine Klassen importiert, die zu Unterpaketen gehören
Test importieren. *
Importiert test.MyClass1
, aber nicht test.MyClass2
Auf Klassen, die zum Standardpaket (anonymes Paket) gehören, kann nur von Klassen aus zugegriffen werden, die zu einem anonymen Paket gehören. Der Import kann überhaupt nicht geschrieben werden, was zu einem Kompilierungsfehler führt.
Beim Zugriff auf statische Felder und Methoden
import static jp.co.xxx.Sample.num
import static jp.co.xxx.Sample.print
Sie können den Modifikator weglassen, indem Sie ihn einstellen ** nicht "statischer Import", sondern "statischer Import" **
public static void main (String[] xxx)
public static void main (String... xxx)
Irgendein von.
--javac Befehl (Kompilieren) hat ** Erweiterung **, Java Befehl (Ausführen) hat ** keine Erweiterung **
javac Main.java
java Main
Datentyp | Wert |
---|---|
boolean | 1 bit |
char | 16-Bit-Unicode-Zeichen |
byte | 8 bit |
short | 16 bit |
int | 32 bit |
long | 64 bit |
float | 32 bit |
double | 64 bit |
Byte ist 8 Bit und ich kann mich von dort zweimal erinnern int - lang mit float --double Beachten Sie, dass es positive und negative gibt (Beispiel: 0b11111111 (= 255) wird nicht in Byte eingegeben (-128 bis 127)).
Der numerische Literalwert ist standardmäßig ** int und double **
Ganzzahliges Literal
Basisnummer | Notation |
---|---|
Dezimalzahl | 123 |
Hexadezimal | 0x1A8 |
8 Basis | 0123 |
Binärzahl | 0b011 |
--Numerische Notation mit "\ _" Nicht vor oder nach dem Anfang / Ende / Symbol verwenden ("." "L" "F" "0x" ...) Fortlaufend ist OK
--Char-Typ
Irgendein von String-Literale (doppeltes Anführungszeichen) sind nicht zulässig
Nur "\ _" und "$" können als Bezeichner verwendet werden Zahlen aus dem zweiten Buchstaben
Das einzige Literal, das null ausdrückt, ist "null" ** "NULL" ist nicht möglich **
println (null)
gibt "null" aus
Die Beziehung zwischen Klasse und Instanz ist die Beziehung zwischen Kopierquelle und Kopie
int a = 3;
int b = a += 5; // a = 8, b = 8
int a = 10 * - 10; // a = -100
byte a = 0b10000000; //int → byte ist OK, wenn es außerhalb des Bereichs liegt, aber außerhalb des Bereichs, also ein Kompilierungsfehler
short b = 128 + 128; //Da es im Bereich von kurz, int → kurz, aber OK liegt
int c = 2 * 3L; //Seit langem → int, Kompilierungsfehler
float d = 10.0; //Da double → float, Kompilierungsfehler (10).0f ist OK)
boolean a = 1; //Kompilierungsfehler
byte b = true; //Kompilierungsfehler
--instanceOf bestimmt, ob eine Instanz mit dem angegebenen Typ verarbeitet werden kann
interface A {}
class B implements A {}
---
B b = new B();
System.out.println(b instanceOf B); // true
System.out.println(b instanceOf A); // true
false && x++ == 1; // false, x++Ignorieren
false & x++ == 1; // false, x++Getan werden
true || x++ == 1; // true, x++Ignorieren
true || x++ == 1; // true, x++Getan werden
Die Priorität der Bediener ist
(), ++, - hat die höchste Priorität
** \ *, / und% befinden sich in derselben Zeile **
"==": Identität "equals ()": Äquivalenz
Die equlas-Methode der Object-Klasse ist dieselbe, daher wird angenommen, dass sie überschrieben wird. ** Empfängt die Objektklasse als Argument **. Wenn Sie also den Argumenttyp ändern, wird er nicht überschrieben
--Wenn im Code dasselbe Zeichenfolgenliteral angezeigt wird, wird der Verweis auf dieselbe Instanz wiederverwendet. Mechanismus namens "konstanter Pool" Eine String-Instanz wird im konstanten Speicherbereich anstelle des Instanzspeicherbereichs für String-Literale erstellt. Explizit neu
String a = "test"; //Verweis auf eine String-Instanz, die im konstanten Speicherbereich erstellt wurde
String b = "test"; //Verweis auf eine String-Instanz, die im konstanten Speicherbereich erstellt wurde
System.out.println(a == b) //wahr, nicht nur "gleicher Wert", sondern auch "gleicher Wert"
String c = new String("test"); // //Verweis auf eine String-Instanz, die beispielsweise im Speicherbereich erstellt wurde
System.out.println(a == c) // false
System.out.println(a.equlas(c)) // true
if (Bedingter Ausdruck A.) hoge();
else
if (Bedingter Ausdruck B.) fuga();
else bar();
//Dies entspricht
if (Bedingter Ausdruck A.) hoge();
else {
if (Bedingter Ausdruck B.) fuga();
else bar();
}
nur ** boolesch und lang sind nicht **
** Variablen sind in keinem von ** erlaubt
int[] a = new int[0]; //Sie können auch ein Array-Objekt mit 0 Elementen erstellen
int[] b = new int[3];
ArrayList<Integer> c = new ArrayList<>();
System.out.println(a); // [I@677327b6
System.out.println(b); // [I@14ae5a5 * Im Gegensatz zu ArrayList wird der Inhalt auch beim Drucken nicht angezeigt.
System.out.println(c); // []
//Beide können kompiliert werden
int[] a;
int b[];
int[][] c[];
int[3] a; //Kompilierungsfehler
int b[3]; //Kompilierungsfehler
int c[] = new int[3]; // OK. int[3]Eine Array-Instanz von wird erstellt und ein Verweis darauf wird in c festgelegt
int[] a = new int[3 * 5]; // ok
int x = 5;
int[] b = new int[x]; // ok
int[] c = new int[3.5]; //Kompilierungsfehler
int[] d = new int[]; //Kompilierungsfehler
int[][][] e = new int[3][4][5]; // ok
int[][][] f = new int[3][][]; // ok
int[][][] g = new int[][][5]; //Kompilierungsfehler
Das Standardelement beim Erstellen einer Array-Instanz ist festgelegt --Numerischer Typ: 0
Referenztyp: null
Der Inhalt des Arrays kann mit dem Array-Initialisierungsoperator {} initialisiert werden
int[] a = {2, 3}; // ok
int[] b = new int[]{2, 3}; // ok
int[] c = new int[2]{2, 3}; //Kompilierungsfehler Geben Sie bei Verwendung des Initialisierungsoperators nicht die Anzahl der Elemente an
int[] d = {}; //Ok ohne Elemente
int[] e;
e = {}; //Kompilierungsfehler Der Initialisierungsoperator kann nur verwendet werden, wenn eine Variable vom Typ Array deklariert wird
--Array-Typvariablen können implizit in übergeordnete Klassenarray-Typvariablen (Upcast) typkonvertiert werden.
Child[] c = new Child[]{new Child(), new Child()}
Parent[] p = c; // ok
Sie können das Array mit der Methode clone () kopieren Es wird jedoch bis zur ersten Dimension dupliziert Bei einem mehrdimensionalen Array wird ab der zweiten Dimension auf dieselbe Instanz verwiesen.
Sie können ein Array auch mit der Methode arraycpy () kopieren
arraycpy(src, srcStartIndex, dst, dstStartIndex, numOfElements)
Die while-Anweisung verursacht auch ohne Verarbeitung keinen Kompilierungsfehler
--Beispiel: while (true); // Endlosschleife
Mehrere Variablen können im Initialisierungsausdruck der for-Anweisung deklariert werden, jedoch nur vom gleichen Typ Für mehrere Dokumente können nur Initialisierungs- / Aktualisierungsformeln verwendet werden Es gibt immer einen bedingten Ausdruck
for (int i = 0, j = 10; true; i++, j++) {}// ok
for (int i = 0, long j = 10; true; i++) {}//Kompilierungsfehler
for (int i = 0; true, i < 10; i++) {} //Kompilierungsfehler
In der for-Anweisung ist es in Ordnung, auch wenn der bedingte Ausdruck weggelassen wird Endlosschleife, es sei denn, break wird verwendet
** Da die Referenzvariable in die erweiterte for-Anweisung ** kopiert wird, wirkt sich das Ändern des Referenzziels nicht auf das ursprüngliche Array aus.
Sample[] array = {new Sample(1), new Sample(2), new Sample(3)};
System.out.println(array[0].getValue()); // 1
for (Sample s : array){
s = new Sample(4);
System.out.println(s.getValue()); // 4
}
System.out.println(array[0].getValue()); // 1
// s.setValue(4)In diesem Fall ist auch die ursprüngliche Anordnung betroffen.
Die erweiterte for-Anweisung kann nur einzeln in Vorwärtsrichtung verarbeitet werden.
Durch die Verwendung von Beschriftungen können Sie frei festlegen, wohin die Kontrolle über Fortsetzen und Unterbrechen übertragen werden soll (ursprünglich nur die neueste). Etiketten können überall platziert werden
--Variables Längenargument
Drei Punkte nach dem Argumenttyp
- void sample (int... num){ System.out.println(num[0]); }
Argumente mit variabler Länge können nur beim letzten Argument verwendet werden
Beim Laden einer Klassendatei werden statische Felder und statische Methoden im "statischen Bereich" platziert. Die Definition des anderen Teils wird im "Heap-Bereich" abgelegt und bei jeder Erstellung einer Instanz gelesen. So können statische Felder ohne Instanz verwendet werden
Auf nicht statische Methodenfelder kann nicht über statische Methoden zugegriffen werden
Überladen muss eine separate Signatur haben Signatur = Methodenname + Argumenttyp / Reihenfolge ** Sie können den Zugriffsmodifikator, den Argumentnamen oder den Rückgabetyp nicht ändern **
Konstruktorbeschränkungen
Richten Sie den Methodennamen und den Klassennamen aus
** Rückgabetyp kann nicht beschrieben werden **
** Wenn Sie einen Rückgabewert schreiben, wird dieser nur als Methode interpretiert, nicht als Konstruktor **
Kann nur mit neuen verwendet werden
** Jeder Zugriffsmodifikator ist akzeptabel (privat ist auch möglich) **
Der Initialisierungsblock ({} direkt unter der Klasse) wird vor dem Konstruktor ausgeführt
** Standardkonstruktor wird nicht generiert, wenn Sie explizit einen Konstruktor schreiben ** Beachten Sie, dass beim Schreiben eines Konstruktors mit Argumenten der Standardkonstruktor ohne Argumente nicht generiert wird.
In einer Unterklasse ** muss der Konstruktor der Superklasse immer am Anfang seines eigenen Konstruktors aufgerufen werden ** Wenn nicht angegeben, wird super () am Anfang des Codes eingefügt Wenn die übergeordnete Klasse kein super () enthält, tritt daher ein Kompilierungsfehler auf.
Verwenden Sie this (), um einen anderen Konstruktor aufzurufen Dies muss zuerst aufgerufen werden
Zugriffsmodifikator
Qualifikation | Erläuterung |
---|---|
public | Alles ok |
protected | Nur Unterklassen oder Klassen im selben Paket |
Keiner | Nur Klassen im selben Paket |
private | Nur aus der Klasse heraus |
――Die folgenden beiden werden nicht in die Unterklasse übertragen --Konstrukteur --private Feldmethode
Schnittstellenfunktionen
Kann nicht instanziiert werden
** Methode ist nur öffentlich, auch wenn öffentlich weggelassen **
Ich kann keine Implementierung haben ({} kann nicht beschrieben werden)
** Felder können auf Folgendes beschränkt werden ** --final (= konstant ohne Änderung) --static (= kann ohne Instanziierung verwendet werden)
Implementierung (Realisierung) ist implementiert, mehrfache Realisierung ist möglich
Sie können eine Schnittstelle erstellen, die die Schnittstelle mit erweitert erbt
Die konkrete Klasse muss alle abstrakten Methoden der Schnittstelle implementieren Abstrakte Klassen müssen nicht
Merkmale der abstrakten Klasse
Kann nicht instanziiert werden
Einoko der Schnittstelle und der konkreten Klasse Das heißt, es gibt sowohl eine abstrakte als auch eine konkrete Methode, und ** Felder können auch definiert werden **
Eine konkrete Klasse, die eine abstrakte Klasse erbt, muss alle abstrakten Methoden implementieren
Die abstrakte Methode der abstrakten Klasse muss nicht öffentlich sein
Regeln überschreiben
Der Rückgabewert ist der gleiche oder eine Unterklasse (= kovarianter Rückgabewert)
Gleiche Unterschrift
** Zugriffsmodifikatoren sind gleich oder lockerer **
Da die abstrakte Methode der Schnittstelle öffentlich ist, müssen alle konkreten Klassen auch öffentlich sein.
Eine Unterklasse hat sowohl eine Oberklasse als auch eine Instanz der Unterklasse und wird als eine Instanz im Erscheinungsbild betrachtet.
Daher muss im Unterklassenkonstruktor auch der Oberklassenkonstruktor zuerst aufgerufen werden. --Wenn ein gleichnamiges Feld in einer Oberklasse und einer Unterklasse definiert ist, werden beide getrennt gehalten. (Die überschriebene Methode wird jedoch als eine Instanz betrachtet.)
Wenn Sie sich auf ein Feld mit demselben Namen beziehen, hängt das zu verwendende Feld vom Typ der deklarierten Variablen ab.
Wenn Sie von einer Methode referenziert werden, verwenden Sie das Feld der Klasse, in der die Methode deklariert ist.
class Parent {
String val = "P";
public String getVal1(){
return val;
}
public String getVal2(){
return val;
}
}
class Child extends Parent {
String val = "C";
public String getVal2(){
return val;
}
}
class Main {
public static void main (String args[]){
Parent p = new Parent();
Parent c = new Child();
System.out.println(p.val); // P
System.out.println(c.val); //Da es als Elternteil deklariert ist, ist P.
System.out.println(p.getVal1()); // P
System.out.println(c.getVal1()); //Da es sich um eine in Parent deklarierte Methode handelt, wird P.
System.out.println(p.getVal2()); // P
System.out.println(c.getVal2()); //C, weil es überschrieben wurde
}
}
interface A { public void abst(); }
class B { public void abst(); }
class C extends B implements A{ } // ok.Wird in Betracht gezogen, um die abstrakte Methode von A zu implementieren
--Cast = "Kompatibilitätsgarantie mit dem Compiler"
(String) 1 // Kompilierungsfehler
--Kompilierungsfehler, auch wenn Sie zwischen nicht geerbten Klassen umwandelnclass Parent {}
class Child extends Parent{ }
class Main{
public static void main(String args[]){
Parent c = new Child();
Parent p = new Parent();
Child c_ = (Child) c; // ok
Child p_ = (Child) p; //Kompiliert, aber zur Laufzeit ClassCastException
}
}
int num = 10;
if (num < 11){
int num = 20; //Kompilierungsfehler
int value = 100; //OK, da der Umfang unterschiedlich ist
}
int value = 200;
--try-catch-finally-Syntax ――Die Reihenfolge kann nicht geändert werden - try
Erforderlich ・ Nur eine
Kann weggelassen werden / Mehrere Beschreibungen sind möglich
Ausgelassen ・ Nur eine
Weder fangen noch endgültig weglassen
Auch wenn Sie in catch zurückkehren, kehren Sie zurück, nachdem die finally-Anweisung ausgeführt wurde
Wenn Sie sowohl in der catch- als auch in der finally-Anweisung zurückkehren, wird diese mit finally return überschrieben. Da es sich um ein Bild mit einer Nur-Rückgabe-Variablen handelt, wird das Umschreiben der schließlich zurückgegebenen Variablen nicht überschrieben.
public static int sample1(){
try {
throw new Exception();
} catch (Exception e){
return 0;
} finally {
return 1;
}
}
public static int sample2(){
int val;
try {
throw new Exception();
} catch (Exception e){
val = 0;
return val;
} finally {
val = 1;
}
}
public static void main (String args[]){
System.out.println(sample1()); // 1
System.out.println(sample2()); // 0
}
--Wenn eine Ausnahme auftritt --Verfahren Sie mit try catch --Declare wirft eine Methode ein
Sie müssen einen der folgenden Schritte ausführen. Dies gilt auch für diejenigen, die die deklarierte Throws-Methode verwenden ** Die Hauptmethode erfordert auch eine der beiden oben genannten **
Error
Wenn im statischen Initialisierer eine Ausnahme auftritt (statische Variablen initialisieren usw.) Da niemand die Ausnahme benachrichtigt, wird dieser Fehler ausgegeben und das Programm wird zwangsweise beendet.
Es gibt einige, die den bedingten Ausdruck der Behauptung nicht erfüllen.
Einige Fehler in der JVM
Elternklasse für OutOfMemoryError, StackOverflowError, InternalError --JVM ist kaputt usw.
RunTimeException
Außerhalb des Reichweitensystems - ArrayIndexOutOfBoundsException
Zugriff außerhalb des Bereichs in einem Array - IndexOutOfBoundsException
Zugriff außerhalb des Bereichs auf ArrayList - StringIndexOutOfBoundsException
Zugriff außerhalb des Bereichs mit string.charAt ()
Illegales System - IllegalArgumentException
Die Voraussetzungen des Arguments werden nicht beachtet - IllegalStateException --Ich bin nicht bereit --Andere - ClassCastException - NumberFormatException - NullPointerException - SecurityException
String
--String ist eine Unterklasse von CharSequence
Grundlegende Methode von String
replaceAll(".", "hoge")
Ersatz durch regulären Ausdruck
replace("src", "dst")
Einfacher Austausch (alle, wenn mehrere erscheinen)
charAt(index)
indexOf("abc")
Wenn nicht -1
subString(start, end)
subString(start)
trim()
Leerzeichen, \ t (Tabulatorzeichen), \ n \ r (Zeilenvorschub)
Entfernen Sie sie nur vor und nach der Zeichenfolge nicht in der Zeichenfolge
startsWith("a")
endsWith("a")
split("\\w\\s")
Aufteilen durch regulären Ausdruck
\ w: Wortbestandteile
\ s: Leerzeichen
\ d: Nummer
Das Kapital ist umgekehrt
concat("a")
verbinden
Verkettung von Zeichenketten
String a = "30" + 5; // 305
String b = "30" + 5 + 8; // = "305" + 8 = "3058"
String c = 5 + 8 + "30"; // = 13 + "30" = "1330"
String d = "hoge" + null; // = "hogenull"
--StringBuilder hat standardmäßig einen Puffer für 16 Zeichen
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb.capacity()); // 3 + 16 = 19
StringBuilder sb2 = new StringBuilder(5);
System.out.println(sb2.capacity()); // 5
--StringBuilder-Methoden - append(x) --x kann alle primitiven Typen enthalten 10 ist "10", wahr ist "wahr" - insert(index, "hoge") - delete(start, end) - deleteCharAt(index) - reverse() - replace(start, end, "hoge") - subString(start, end) - String - subSequence(start, end) - CharSequence - toString()
Gibt eine interne Zeichenfolge zurück
parseXXX
Integer.parseInt("123")
Vom String zum Grundelement
valueOf
Integer.valueOf("123")
Von der Zeichenfolge zur Wrapper-Klasse --Diese unterscheiden nicht zwischen Groß- und Kleinschreibung
//Funktionsschnittstelle
interface Algorithm1 {
void perform(String name);
}
interface Algorithm2 {
String perform(String name);
}
---
Algorithm1 a = (String name) -> { System.out.println(name); }
Algorithm1 b = (name) -> { System.out.println(name); } //Der Argumenttyp ist optional
Algorithm1 c = name -> System.out.println(name); //Wenn es nur ein Argument gibt()Optional, wenn es nur eine Methode gibt{}Optional
Algorithm2 d = name -> { return "hello " + name + " !"; }
Algorithm2 e = name -> "hello " + name + " !"; //Benötigen Sie einen Rückgabewert{}Wenn nicht angegeben, kann die Rückgabe nicht beschrieben werden
Algorithm2 e = name -> return "hello " + name + " !"; //Kompilierungsfehler
--Um auf lokale Variablen zuzugreifen, die außerhalb des Lambda-Ausdrucks innerhalb des Lambda-Ausdrucks deklariert wurden Muss eine praktisch endgültige Variable sein (eine Variable, die sich nie ändert)
DateTime
LocalDate
unveränderlich für veränderlichen Clendar
Der Monat beginnt
LocalDate.of(2018, 12, 24)
LocalDate.parse("2015-01-01")
Das Grundformat ist "JJJJ-MM-TT"
--DataTimeException für nicht vorhandene Daten
- LocalDate.of(2017, 1, 32) // DateTimeException
LocalTime
24 Stunden
plusHours(10)
LocalDateTime
Kombiniertes LocalDate und LocalTime
Duration
Umgang mit dem Zeitunterschied
Duration d = Duration.between(start, end)
Period
Umgang mit Datumsunterschieden
Period p = Period.between(start, end)
Period p = localDate.until(target)
DateTimeFormatter
** ISO_DATE_TIME ** ist der Standard?
localDateTime.format( DateTimeFormatter.ISO_DATE_TIME ) // 2018-08-31T00:00:00
ArrayList
ArrayList
Nicht threadsicher --Vektor ist threadsicher
add(element)
add(index, element)
set(index, element)
remove(element)
** gleiche Elemente mit equals () finden und löschen **
Lösche nur den ersten ――Die Elemente dahinter bewegen sich nach oben
Wenn Sie beim Lesen in einer Schleife remove aufrufen,
ConcurrentModificationException wird ausgelöst, außer beim Entfernen am Ende der Schleife
Wenn es Ihnen nicht gefällt, verwenden Sie den Iterator
--removeIf (Lambda-Ausdruck)
Die Generika von List und ArrayList legen Einschränkungen fest und müssen dies nicht sein (es handelt sich um eine Objekttypliste).
tips
//Die Ausnahme der Unterklasse folgt
try {} catch (Exception e) {} catch (IOException e) { /** cannot reach **/ };
//Schreiben Sie den Vorgang nach dem Fortfahren
for (int i : list){
if ( flg ) {
continue;
hoge(); // cannot reach
}
}
//Bearbeitung nach Rücksendung
void sample(){
return;
hoge(); // cannot reach
}
Recommended Posts