JAvaコンパイル時と実行時の概念とインスタンスの詳細

4364 ワード

Javaコンパイル時と実行時の重要な概念ですが、ずっとはっきりしていません.今回は専門ブログで概念を書きました.
基礎概念
コンパイル時
コンパイル時はその名の通りコンパイル中である.コンパイルとは何ですか?コンパイラがソースコードを機械で認識できるコードに翻訳してあげます.(もちろん一般的な意味ではそうですが、実際にはある中間状態に翻訳された言語にすぎないかもしれません.例えばJavaはJVMで認識されているバイトコードしかありません.また、どんなリンクもあります.アセンブリもあります.理解しやすいようにコンパイラと総称して使用できます)
では、コンパイルするときは簡単に翻訳の仕事をします.例えば、お兄さんがうっかりキーワードを書き間違えたかどうかをチェックします.どんな文法分析、文法分析などの過程がありますか.先生が学生の作文に誤字や病句があるかどうかをチェックするように.何か間違ったコンパイラを見つけたら教えてあげます.コンパイル時にメモリを割り当てるなど、間違いに違いないという人もいます.
実行時
実行時とはコードが走り出すことである.メモリにロードされました.(あなたのコードはディスクに保存してメモリを入れない前に死んだやつです.メモリに走ってこそ生きています).実行時タイプチェックは、前述のコンパイル時タイプチェック(または静的タイプチェック)とは異なる.単純なスキャンコードではありません.メモリの中でいくつかの操作をして、いくつかの判断をします.(このように多くのコンパイル時に発見できないエラーは、実行中にエラーを発見することができ、書くときにこの論理エラーを避けたほうがいい)
列を挙げる

int arr[] = {1,2,3}; 
int result = arr[4]; 
System.out.println(result); 
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4 

上のコードを見てみると、間違ったコードだと知っています.配列が境界を越えています.しかし、コンパイラでは間違いなく、run後にArrayIndexOutOfBoundsExceptionが現れた.コンパイラは実はとても愚かで、まだあなたの头がそんなに聡明ではありませんて、そこであなたはコンパイラが少し愚かだと思って、しかし运行する时间违いを発见してもまだ悪くありません.
面接問題

                         。                     。 
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

 }

}
                                                                                                                                                                            
A.行Aのコードでは、productの値はコンパイル期間で計算され、行Bは実行時に計算されます.Java逆コンパイラ(jd-guiなど)を使用してConstantFolding.classファイルを逆コンパイルすると、次の結果から答えが得られます.

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コンパイラで使用される最適化技術です.final変数の値は変わらないので、最適化できます.Java反コンパイラとjavapコマンドは、コンパイルされたコード(バイトコードなど)を表示する利器です.
メソッドリロード:これはコンパイル時に発生します.メソッドのリロードは、コンパイラがパラメータのタイプに応じてどのメソッドを使用するかを選択できるため、コンパイル時マルチステートとも呼ばれます.

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”);
入力されたパラメータが文字列定数であることに基づいて、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);
例外(Exception):実行時例外またはコンパイル時例外を使用できます.
ランタイム例外(RuntimeException)は、未検出の例外(unchecked exception)とも呼ばれ、コンパイラで検出する必要がないことを示します.
RuntimeExceptionは、実行時に放出できるすべての例外の親です.1つの方法は、例外をキャプチャする以外に、実行時に投げ出す可能性があります.
RuntimeExceptionのサブクラスは、throw文で放出された例外を宣言する必要はありません.
例:Null PointerException、ArrayIndexOutOfBoundsExceptionなど
チェック対象例外(checked exception)は、コンパイラがコンパイル時に検証し、throws文またはtry{}cathch{}文ブロックで検出異常を処理します.コンパイラは、メソッドまたはコンストラクション関数を実行するときにどの異常が投げ出されるかを分析します.
この文章があなたの役に立つことを望みます