Dieser Artikel bietet eine detaillierte Erklärung der Kompilierungszeit und Laufzeit von Java-Programmen anhand von Beispielen. Freunde, die sie benötigen, können darauf zurückgreifen.
Java-Kompilierungszeit und -Laufzeit sind sehr wichtige Konzepte, die jedoch nicht klargestellt wurden Diesmal. Spezieller Blog, um über das Verständnis von Konzepten zu schreiben.
Grundlegende Konzepte
Kompilierungszeit
Kompilierungszeit Wie der Name schon sagt, handelt es sich um Kompilierungszeit. Was bedeutet also, dass der Compiler Ihnen hilft, den Quellcode in Code zu übersetzen, den die Maschine erkennen kann? Tatsächlich kann es nur in einen bestimmten Zwischenzustand übersetzt werden. Beispielsweise verfügt Java nur über Bytecode, der von der JVM erkannt wird. Darüber hinaus gibt es Linker und Assembler, die wir zusammenfassen können Nennen Sie es einen Compiler)
Der sogenannte laufende Code wird in den Speicher geladen (Ihr Code ist tot, wenn er auf der Festplatte gespeichert und nicht in den Speicher geladen wird. Es wird erst lebendig, wenn es im Speicher ausgeführt wird. Die Typprüfung zur Laufzeit unterscheidet sich von der zuvor erwähnten statischen
Typprüfung des Codes besteht darin, einige Operationen und Beurteilungen im Speicher durchzuführen (Auf diese Weise können viele Dinge beim Kompilieren nicht erkannt werden. Beim Ausführen können Fehler gefunden werden. Es ist am besten, diesen logischen Fehler beim Schreiben zu vermeiden.) Wenn Sie sich das ansehen Code, Sie werden wissen, dass es sich um einen falschen Code handelt. Es wird jedoch kein Fehler gemeldet, wenn der Compiler ausgeführt wird Dumm, und es ist nicht so klar wie dein Verstand. Du denkst also, dass der Compiler zwar ein bisschen dumm ist, es aber nicht so schlimm ist, wenn du beim Ausführen Fehler findest.
A. Im Code von Zeile A wird der Wert des Produkts zur Kompilierungszeit berechnet, während Zeile B zur Laufzeit berechnet wird. Wenn Sie einen Java-Decompiler (z. B. jd-gui) verwenden, um die Datei „ConstantFolding.class“ zu dekompilieren, erhalten Sie die Antwort aus den folgenden Ergebnissen.
int arr[] = {1,2,3}; int result = arr[4]; System.out.println(result); Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4
Konstante Faltung ist eine Optimierungstechnik
, die vom Java-Compiler verwendet wird. Da sich die Werte der endgültigenVariablen nicht ändern, können sie optimiert werden. Der Java-Decompiler und der Befehl javap sind beide leistungsstarke Tools zum Anzeigen von kompiliertem Code (z. B. Bytecode).
理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。 Q.下面的代码片段中,行A和行B所标识的代码有什么区别呢? public class ConstantFolding { static final int number1 = 5; static final int number2 = 6; static int number3 = 5; static int number4= 6; public static void main(String[ ] args) { int product1 = number1 * number2; //line A int product2 = number3 * number4; //line B } }
Methodenüberladung
public class ConstantFolding { static final int number1 = 5; static final int number2 = 6; static int number3 = 5; static int number4 = 6; public static void main(String[ ] args) { int product1 = 30; int product2 = number3 * number4; } }
Wenn der Compiler die folgende Anweisung kompilieren möchte:
basiert sie auf dem übergebenen Parameter, der ein < ist 🎜> Zeichenfolge Konstante, generiert Bytecode für den Aufruf von Methode Nr. 1Methodenüberschreibung:
Dies geschieht zur Laufzeit. Das Überladen von Methoden wird als Laufzeitpolymorphismus bezeichnet, da der Compiler zur Kompilierungszeit nicht weiß und auch nicht wissen kann, welche Methode er aufrufen soll. Die JVM trifft Entscheidungen, während der Code ausgeführt wird.public class { public static void evaluate(String param1); // method #1 public static void evaluate(int param1); // method #2 }
1evaluate(“My Test Argument passed to param1”);
Der Compiler kann nicht wissen, ob der Typ der übergebenen Parameterreferenz A oder B ist. Daher kann die Entscheidung, Methode #3 oder Methode # aufzurufen, nur zur Laufzeit basierend auf dem Typ des
getroffen werden, das der -Eingabevariablen „Referenz“ zugewiesen ist (z. B. eine Instanz von A oder B) 4
Generika (auch Typprüfung genannt): Dies geschieht zur Kompilierungszeit. Der Compiler ist dafür verantwortlich, die Richtigkeit der Typen im Programm zu überprüfen und dann den Code, der Generika verwendet, in nicht generischen Code zu übersetzen oder umzuschreiben, der auf der aktuellen JVM ausgeführt werden kann. Diese Technik wird „Type Erasure“ genannt.
public class A { public int compute(int input) { //method #3 return 3 * input; } } public class B extends A { @Override public int compute(int input) { //method #4 return 4 * input; } }
public int evaluate(A reference, int arg2) { int result = reference.compute(arg2); }
Nach der Kompilierung wird daraus:
Ausnahme: Sie können eine Laufzeitausnahme verwenden oder eine Ausnahme zur Kompilierungszeit.
RuntimeException wird auch als ungeprüfte Ausnahme bezeichnet, was bedeutet, dass diese Ausnahme vom Compiler nicht erkannt werden muss.
RuntimeException ist die übergeordnete Klasse aller Ausnahmen, die zur Laufzeit ausgelöst werden können. Zusätzlich zum Abfangen von Ausnahmen kann eine Methode bei der Ausführung 1List myList = new ArrayList(10);
auslösen.
Eine Unterklasse von RuntimeException, dann muss keine Throw-Anweisung verwendet werden, um die ausgelöste Ausnahme zu deklarieren.
Zum Beispiel: NullPointerException, ArrayIndexOutOfBoundsException usw.
Geprüfte Ausnahmen werden vom Compiler zur Kompilierungszeit durch throws-Anweisungen oder den try {}cathch{}-Anweisungsblock überprüft um Erkennungsausnahmen zu behandeln. Der Compiler analysiert, welche Ausnahmen beim Ausführen einer Methode oder eines Konstruktors ausgelöst werden.
[Verwandte Empfehlungen]
1. Kostenloses Java-Video-Tutorial
2. Alibaba Java-Entwicklungshandbuch
3. JAVA-Anfänger-Video-Tutorial
Das obige ist der detaillierte Inhalt vonDetaillierte Beispiele der beiden Konzepte der Java-Ausführung, -Kompilierung und -Operation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!