(Aktualisierung) In diesem Blog werden die Notizen aufgezeichnet, die ich (ZhongUncle) gemacht habe, als ich Java lernte, damit ich sie schnell überprüfen kann, wenn ich sie später vergesse. Da Java der C-Sprachfamilie sehr ähnlich ist, werden hier nur die Unterschiede zu C/C++ erfasst, sodass dieser Blog nicht für Programmieranfänger geeignet ist.
Hinweis: Wenn Sie im Folgenden das Codeformat wie java
dieses verwenden, bezieht es sich auf einen Befehl oder ein Verzeichnis/eine Datei. Java bezieht sich auf die Java-Sprache oder das Java-Projekt.
Da es nach persönlichen Hobbys und Lernreihenfolge geschrieben ist, wird zum besseren Lesen empfohlen, zur Ansicht durch das Seitenverzeichnis zu springen.
Die Parameter der Hauptfunktion argv
sind unterschiedlich
Beim Schreiben von CLI-Programmen in allen Sprachen main
müssen die Parameter der Funktion einen Parameter zum Aufzeichnen des Eingabebefehls enthalten.
Sprache | Stil |
---|---|
C-ähnliche Sprachen (C, C++, C# usw.) | int main(int argc, const char * argv[]) |
Java | public static void main(String[] args) |
Bei der Eingabe eines Befehls wird dieser command <option> [arguments...]
entsprechend dem Leerzeichen in das Zeichenfolgenarray eingefügt ( *argv[]
es speichert die erste Adresse der Zeichenfolge, die direkt als Zeichenfolge verstanden werden kann). Weitere Informationen finden Sie unter „Was sind die Parameter argc und argv der Funktion main in der C-Sprache?“ .
Aber es gibt einen sehr wichtigen Unterschied zwischen den beiden. In einer C-ähnlichen Sprache *argv[0]
ist es command
eine Zeichenfolge (d. h. der Programmname); in Java enthält es jedoch nicht den Programmnamen, d. args[0]
h. die erste Option oder den ersten Parameter.
Betriebsmechanismus
Im Folgenden werden die Kompilierungsmethoden der beiden stark vereinfacht, nur um die beiden zu unterscheiden. Wenn Sie den Kompilierungsprozess oder den Compiler wirklich studieren möchten, lesen Sie nicht den folgenden Absatz, sondern lesen Sie bitte „Kompilierungsprinzipien“ oder einen speziellen Blog, der von anderen geschrieben wurde.
Der Betriebsmechanismus von Java- und C-Sprachprogrammen ist sehr unterschiedlich.
Der Betriebsmodus des C-Sprachprogramms besteht darin, den C-Sprachcode in Maschinencode (Maschinencode) zu kompilieren und ihn dann direkt vom Computer auszuführen. Java hingegen kompiliert Java-Code in Bytecode (Bytecode), der dann von der Java Runtime Environment (JRE) ausgeführt wird.
Im Gegensatz dazu ähnelt Java eher einem Skript (da es noch einen Konvertierungsprozess gibt, wird das Skript direkt ausgeführt), aber Java kann wie ein Skript ausgeführt werden. Sie können meinen anderen Blog lesen: „Wie man mit Java schreibt “ script“ (wie man eine einzelne Java-Datei verwendet, um wie ein Skript auszuführen)》 .
Codestruktur
Die Codestruktur von Java besteht aus Klassen (Class), die denen in C++ ähneln. Das klassischste „Hello World“, wenn es in Java geschrieben ist, ist beispielsweise:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Es ist ersichtlich, dass der Java-Quellcode aus einer (oder mehreren) Klassen besteht und diese direkt miteinander verbunden sind. main
Und der Name der Klasse , die die Funktion enthält HelloWorld
, ist der Name des „Programms“ (bitte gehen Sie zum Abschnitt „Konvertieren und Ausführen von Java-Programmen“, um zu erfahren, warum das Programm in Anführungszeichen steht), und diese Klasse wird auch „Startup“ genannt Klasse“ (es gibt noch eine andere). Wenn die erste Methode keine main
Methode zum Starten verwendet, gehen Sie bitte zum Abschnitt „Ausführen main
einer Klasse ohne Funktionen (ein Programm ohne Hauptmethode)“).
public static
Es ist zu beachten , dass hier Modifikatoren verwendet werden müssen main
, um die Funktion zu ändern. Andernfalls wird beim Ausführen ein Fehler gemeldet.
Programmname
main
Wie im vorherigen Abschnitt erwähnt, ist der Name der Klasse, die die Funktion enthält , der Name des Java-Programms. Es ist jedoch zu beachten, dass auch der Dateiname als dieser Name vereinheitlicht werden sollte. Wenn der Name der Quellcodedatei nicht mit dem Klassennamen übereinstimmt, wird ein Fehler gemeldet. Dies liegt daran, dass sich die öffentlichen Klassen von Java in einer gleichnamigen Java-Datei befinden müssen.
Nehmen wir den obigen Code als Beispiel: Wenn Sie die Quellcodedatei umbenennen test.java
, wird der folgende Fehler gemeldet:
$ javac test.java
test.java:1: 错误: 类 HelloWorld 是公共的, 应在名为 HelloWorld.java 的文件中声明
public class HelloWorld {
^
1 个错误
Java-Programme konvertieren und ausführen
Der Java-Code kann auf drei Arten verwendet werden:
- Die erste ist eine skriptähnliche Methode. Weitere Informationen finden Sie unter: „So verwenden Sie Java, um ein „Skript“ zu schreiben (wie Sie eine einzelne Java-Datei verwenden, um wie ein Skript auszuführen)“ ;
- Die zweite besteht darin,
javac
den Java-Quellcode (.java
Suffixdatei) in Java-Bytecode (in.class
der Suffixdatei gespeichert) zu konvertieren undjava
ihn dann zum Ausführen zu verwenden. - Die dritte besteht darin,
java
den Java-Quellcode direkt „auszuführen“.
Angenommen, der Quellcode lautet:
//文件名“HelloWorld.java”
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Die zweite Methode
Die zweite Methode kompiliert die Befehle und führt sie wie folgt aus:
$ javac HelloWorld.java
$ java HelloWorld
Hello World!
javac HelloWorld.java
Es wird eine HelloWorld.class
Datei mit dem Namen generiert. Der Inhalt besteht aus kompilierten Java-Klassendaten (kompilierte Java-Klassendaten).
Beim Ausführen wird also nicht HelloWorld.class
die Datei tatsächlich ausgeführt, sondern java
diese Klasse direkt zum Ausführen aufgerufen.
Aus diesem Grund main
muss die Klasse, die die Funktion enthält, denselben Namen haben wie die Quelldatei. Denn wenn es nicht dasselbe ist, kommt es beim Kompilieren zu entsprechenden Fehlern.
dritte Methode
Der Befehl zum Kompilieren und Ausführen der dritten Methode lautet wie folgt:
$ java HelloWorld.java
Hello World!
Es ist ersichtlich, dass der Effekt derselbe ist.
Klassen ohne Funktionen ausführen main
(Programme, die nicht die Hauptmethode verwenden)
Wie oben erwähnt, muss das Java-Programm über eine main
Funktion verfügen, die als „Eintrag“ für die Klassen in der Quellcodedatei dient. Kann ein Java-Programm also keine Funktionen haben main
?
Die Antwort lautet „Ja“, solange Sie einen statischen Block (Static Block) oder einen sogenannten statischen Initialisierungsblock (Static Initialization Block) verwenden.
Ein statischer Block ist eine Folge von Anweisungen. Wenn die Klasse von ClassLoader in den Speicher (Stapelspeicher) geladen wird, werden diese Anweisungen nur einmal ausgeführt.
Das folgende Programm hat beispielsweise keine Klassen:
class StaticBlock {
static
{
System.out.println("注意:这个类没有 main 函数");
System.exit(0);
}
}
Der Laufeffekt ist wie folgt:
$ java StaticBlock.java
注意:这个类没有 main 函数
Es ist ersichtlich, dass es normal funktioniert.
Holen Sie sich die Eingabezeichenfolge
Im Gegensatz zu C oder C++, das in der Standardbibliothek enthalten ist, muss Java importiert werden java.util.Scanner
, um Eingabedaten bequemer zu erhalten , und es ist auch bequemer zu verwenden.getline
cin
Nach dem Import java.util.Scanner
muss auch ein Scanner initialisiert werden:
Scanner scanner = new Scanner(System.in);
Rufen Sie dann die Eingabezeichenfolge auf folgende Weise ab:
String aStr = scanner.nextLine();
verkettete Ausgabezeichenfolge
Manchmal ist es notwendig, eine Zeichenfolge ähnlich diesem Stil auszugeben 总和为:123
. In Java kann es, egal ob es sich um println
, print
oder handelt printf
, nicht \()
auf die gleiche Weise eingefügt werden, sondern es wird eine falsche Zahl +
wie folgt verwendet:
System.out.print("总和为:" + sum);
System.out.printf("总和为:" + sum);
System.out.println("总和为:" + sum);
Wie verwendet Java sich selbst oder eine übergeordnete Klasse, um ein Objekt in einer Klasse zu erstellen?
Wenn beim Deklarieren einer Mitgliedsvariablen in einer Klasse die Mitgliedsvariable ein Objekt einer Klasse ist, muss sie bei der Deklaration verwendet werden new Point()
. folgendermaßen:
private Point xy = new Point();
Der Grund, warum es beim Deklarieren verwendet werden muss, new Point()
liegt darin, dass beim Erstellen eines Objekts im Voraus geplant werden muss, einen geeigneten Speicherplatz zu reservieren. Java weist jedoch nicht jeder Mitgliedsvariablen Speicherplatz zu, sondern muss ihn zum Zuweisen verwenden new Point()
.
Wenn new Point()
der Speicherplatz nicht vorab aufgeteilt wird, xy
ist das Objekt beim Erstellen leer null
(beim Kompilieren wird kein Fehler gemeldet).
Beispielsweise wird ein solcher Code nicht verwendet new Point()
:
public class test {
public static void main(String[] argv) {
SpacePoint sp = new SpacePoint();
sp.set(1,2,3);
sp.print();
}
}
class Point {
private int x;
private int y;
public void set(int a, int b) {
x=a;
y=b;
}
public void print() {
System.out.print("x: " + x + ", y: " + y);
}
}
class SpacePoint extends Point {
private Point xy;
private int z;
public void set(int a, int b, int c) {
xy.set(a,b);
z=c;
}
public void print() {
xy.print();
System.out.println(", z: " + z);
}
}
Sie können sehen, dass beim Kompilieren kein Fehler gemeldet wird, beim Ausführen jedoch ein Fehler:
$ javac test.java
$ java test
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Point.print()" because "this.xy" is null
at SpacePoint.print(test.java:44)
at test.main(test.java:10)
Ich hoffe, den Bedürftigen helfen zu können