Java の実行、コンパイル、操作の 2 つの概念の詳細な例
この記事では、Java プログラムのコンパイル時間とランタイムについて、例を通して詳しく説明します。必要な方は参考にしてください。
Java のコンパイル時間とランタイムは非常に重要な概念ですが、今回は明確にしていません。概念を理解するために特別なブログを書いてください
基本概念
コンパイル時間とは、名前が示すように、コンパイルが行われるときのことです。ソース コードをマシンが認識できるコードに変換します (もちろん、これは一般的なものであり、実際には中間状態の言語に変換されるだけかもしれません。たとえば、Java には JVM によって認識されるバイトコードしかありません。さらに、理解を容易にするために、これをまとめてコンパイルと呼びます。
静的型チェック) は異なります。単にコードをスキャンするだけではありません。メモリ内でいくつかの操作を実行し、何らかの判断を下します (このようにして、コンパイル中に検出できない多くのエラーを実行時に検出できます。エラーが報告されたことがわかりました。書き込み時にこの論理エラーを回避するため)
たとえば
int arr[] = {1,2,3}; int result = arr[4]; System.out.println(result); Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4
インタビューの質問
理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。 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 } }
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; } }
定数フォールディングは、Java コンパイラによって使用される最適化手法です。最終的な
変数の値は変更されないため、最適化することができます。 Java デコンパイラと javap コマンドはどちらも、コンパイルされたコード (バイトコードなど) を表示するための強力なツールです。
メソッドのオーバーロード: これはコンパイル時に発生します。メソッドのオーバーロードは、コンパイラが引数の型に基づいて使用するメソッドを選択できるため、コンパイル時ポリモーフィズムとも呼ばれます。 public class {
public static void evaluate(String param1); // method #1
public static void evaluate(int param1); // method #2
}
1evaluate(“My Test Argument pass to param1”)
これは、渡されたパラメータ 文字列定数、#1 メソッドを呼び出すバイトコードを生成します
これは実行時に発生します。メソッドのオーバーロードは、コンパイル時にコンパイラがどのメソッドを呼び出すべきかを認識しておらず、認識できないため、実行時ポリモーフィズムと呼ばれます。 JVM はコードの実行中に決定を行います。 1evaluate(“My Test Argument passed to param1”);
它会根据传入的参数是字符串常量,生成调用#1方法的字节码
方法覆盖:这个是在运行时发生的。方法重载被称为运行时多态,因为在编译期编译器不知道并且没法知道该去调用哪个方法。JVM会在代码运行的时候做出决定。
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; } }
子类B中的compute(..)方法重写了父类的compute(..)方法。如果编译器遇到下面的代码:
public int evaluate(A reference, int arg2) { int result = reference.compute(arg2); }
编译器是没法知道传入的参数reference的类型是A还是B。因此,只能够在运行时,根据赋给输入变量“reference”的对象的类型(例如,A或者B的实例)来决定调用方法#3还是方法#4
泛型(又称类型检验):这个是发生在编译期的。编译器负责检查程序中类型的正确性,然后把使用了泛型的代码翻译或者重写成可以执行在当前JVM上的非泛型代码。这个技术被称为“类型擦除“。
换句话来说,编译器会擦除所有在尖括号里的类型信息,来保证和版本1.4.0或者更早版本的JRE的兼容性。
1List myList = new ArrayList(10);
编译后成为了:
1List myList = new ArrayList(10);
rrreee
サブクラス B の compute(..) メソッドは、親クラスの compute(..) メソッドをオーバーライドします。コンパイラーが次のコードに遭遇した場合:
コンパイラーには、渡されたパラメーター参照の型が A であるか B であるかを知る方法がありません。したがって、実行時に 入力変数
"reference" にのみ割り当てることができますメソッド #3 とメソッドのどちらを呼び出すかを決定するオブジェクトのタイプ (A または B のインスタンスなど) #4
ジェネリック (型チェックとも呼ばれます): 🎜これはコンパイル時に発生します。コンパイラーは、プログラム内の型の正確性をチェックし、ジェネリックを使用するコードを現在の JVM で実行できる非ジェネリック コードに変換または書き換える責任を負います。この手法は「型消去」と呼ばれます。 🎜🎜言い換えると、コンパイラは、JRE バージョン 1.4.0 以前との互換性を確保するために、山かっこ内のすべての型情報を消去します。 🎜🎜1List myList = new ArrayList(10);
🎜🎜🎜 コンパイル後は次のようになります: 🎜🎜1List myList = new ArrayList(10); : 実行時例外またはコンパイル時例外を使用できます。 🎜🎜RuntimeException は未チェック例外とも呼ばれます。これは、この例外がコンパイラーによって検出される必要がないことを意味します。 🎜🎜RuntimeException は、実行時にスローされるすべての例外の親クラスです。例外をキャッチするだけでなく、メソッドは実行時に何かをスローする場合があります🎜<p>RuntimeException のサブクラスである場合、スローされた例外を宣言するために throw ステートメントを使用する必要はありません。 <br></p>
<p>例: NullPointerException、ArrayIndexOutOfBoundsException など。<br></p>
<p>チェック例外はコンパイル時にコンパイラによってチェックされ、検出例外は throws ステートメントまたは try{}cathch{} ステートメント ブロックを通じて処理されます。コンパイラーは、メソッドまたは<a href="http://www.php.cn/wiki/77.html" target="_blank">コンストラクター</a>の実行時にどの例外がスローされるかを分析します。 </p>
<p>【関連おすすめ】</p>
<p>1. <a href="http://www.php.cn/course/list/36.html" target="_self">無料のJavaビデオチュートリアル</a></p>
<p>2. <a href="http://www.php.cn/course/346.html" target="_self">Alibaba Java開発マニュアル</a></p>3.
以上がJava の実行、コンパイル、操作の 2 つの概念の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
