Java-Studiennotizen (Datensätze unterscheiden sich von denen der C-Sprachfamilie)

(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 javadieses 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 argvsind unterschiedlich

Beim Schreiben von CLI-Programmen in allen Sprachen mainmü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 commandeine 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. mainUnd 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 mainMethode zum Starten verwendet, gehen Sie bitte zum Abschnitt „Ausführen maineiner Klasse ohne Funktionen (ein Programm ohne Hauptmethode)“).

public staticEs 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

mainWie 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:

  1. 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)“ ;
  2. Die zweite besteht darin, javacden Java-Quellcode ( .javaSuffixdatei) in Java-Bytecode (in .classder Suffixdatei gespeichert) zu konvertieren und javaihn dann zum Ausführen zu verwenden.
  3. Die dritte besteht darin, javaden 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.javaEs wird eine HelloWorld.classDatei mit dem Namen generiert. Der Inhalt besteht aus kompilierten Java-Klassendaten (kompilierte Java-Klassendaten).
Beim Ausführen wird also nicht HelloWorld.classdie Datei tatsächlich ausgeführt, sondern javadiese Klasse direkt zum Ausführen aufgerufen.

Aus diesem Grund mainmuss 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 mainFunktion 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.getlinecin

Nach dem Import java.util.Scannermuss 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, printoder 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, xyist 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

Guess you like

Origin blog.csdn.net/qq_33919450/article/details/129513167