Heim > Java > javaLernprogramm > Detaillierte Beispiele der beiden Konzepte der Java-Ausführung, -Kompilierung und -Operation

Detaillierte Beispiele der beiden Konzepte der Java-Ausführung, -Kompilierung und -Operation

Y2J
Freigeben: 2017-05-05 15:05:23
Original
1288 Leute haben es durchsucht

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)

Dann ist das Kompilieren ein einfacher Vorgang. Einige Übersetzungsarbeiten, z. B. die Überprüfung, ob Sie versehentlich falsche Schlüsselwörter geschrieben haben, sind vorhanden Wie ein Lehrer, der prüft, ob der Aufsatz eines Schülers Tippfehler und falsche Sätze enthält. Manchmal wird Ihnen der Fehler-Compiler sagen, dass die Speicherzuweisung während der Kompilierung definitiv falsch ist Laufzeit

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.

Interviewfragen

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
Nach dem Login kopieren

Konstante Faltung ist eine Optimierungstechnik

, die vom Java-Compiler verwendet wird. Da sich die Werte der endgültigen

Variablen 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

 }

}
Nach dem Login kopieren

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;
 }
}
Nach dem Login kopieren
: Dies geschieht zur Kompilierungszeit. Das Überladen von Methoden wird auch als Polymorphismus zur Kompilierungszeit bezeichnet, da der Compiler basierend auf dem Typ des Arguments auswählen kann, welche Methode verwendet werden soll.

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
}
Nach dem Login kopieren

Die Methode „compute(..)“ in Unterklasse B überschreibt die Methode „compute(..)“ der übergeordneten Klasse. Wenn der Compiler auf den folgenden Code stößt:

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

-Objekts

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;
 } 
}
Nach dem Login kopieren
Mit anderen Worten: Der Compiler löscht alle Typinformationen in spitzen Klammern, um die Kompatibilität mit JRE Version 1.4.0 oder früher sicherzustellen.

public int evaluate(A reference, int arg2) {
 int result = reference.compute(arg2);
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage