JAVAのLISTインターフェースのREMOVEの重荷重方法の呼び出し原理解析
前言
本当のことを言うと、普段はソースコードを見て自分で分かります。
しかし、アルゴリズムを書く時は、javaにおける様々な集合をよく使います。
removeには重負荷関数があり、それぞれの着信パラメータはインデックスindexまたはデータObject(汎型指定後自動変換)であり、指定された汎型が他のデータタイプであれば良いですが、指定されたのはIntegerまたはintであれば、あるいは少し愚昧です。
これはかつて私にも困惑したことがあります。だから、私は実践で困惑を解きます。
テストクラスの設計
テストクラス1
三つのテストクラスはそれぞれintに入ります。Integer、Object型変数、効果を観察します。
テストクラス1着信タイプはintである:転送がintであるremove方法を呼び出す 着信タイプはIntegerです。Integerとして知られるremove方法を呼び出します。 着信タイプはObject:Objectに伝わるremove方法を呼び出します。 テストクラス二着信タイプはint:Integerとしてのremoveメソッドを呼び出す です。着信タイプはIntegerです。Integerとして知られるremove方法を呼び出します。 着信タイプはObject:Objectに伝わるremove方法を呼び出します。 テストクラス3着信タイプはint:Objectに伝えられるremove方法を呼び出す 着信タイプはIntegerです。Objectに伝えられたremove方法を呼び出します。 着信タイプはObject:Objectに伝わるremove方法を呼び出します。 出力結果から,方法のクラスレベルが徐々に高くなると,レベルの低いインペルダウンがアップコンバートされてインペルダウンに適応する必要があることがわかった。
原因分析
次は各テストのソースコードをコンパイルします。結果は次の通りです。
テストクラス1
前文での戸惑いが解消されたのは、jvmでの静的な分派が実現したため、呼び出し順序はint->Integer->Objectとなっています。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
本当のことを言うと、普段はソースコードを見て自分で分かります。
しかし、アルゴリズムを書く時は、javaにおける様々な集合をよく使います。
removeには重負荷関数があり、それぞれの着信パラメータはインデックスindexまたはデータObject(汎型指定後自動変換)であり、指定された汎型が他のデータタイプであれば良いですが、指定されたのはIntegerまたはintであれば、あるいは少し愚昧です。
これはかつて私にも困惑したことがあります。だから、私は実践で困惑を解きます。
テストクラスの設計
テストクラス1
public class Text {
public void remove(int index){
System.out.println(" int remove ");
}
public void remove(Integer object){
System.out.println(" Integer remove ");
}
public void remove(Object object){
System.out.println(" Object remove ");
}
}
テストクラス二
public class Text {
public void remove(Integer object){
System.out.println(" Integer remove ");
}
public void remove(Object object){
System.out.println(" Object remove ");
}
}
テストクラス3
public class Text {
public void remove(Object object){
System.out.println(" Object remove ");
}
}
結果三つのテストクラスはそれぞれintに入ります。Integer、Object型変数、効果を観察します。
テストクラス1
原因分析
次は各テストのソースコードをコンパイルします。結果は次の通りです。
テストクラス1
invokevirtual #11 // Method remove:(I)V
invokevirtual #15 // Method remove:(Ljava/lang/Integer;)V
invokevirtual #18 // Method remove:(Ljava/lang/Object;)V
テストクラス二invokevirtual #11 // Method remove:(Ljava/lang/Integer;)V
invokevirtual #11 // Method remove:(Ljava/lang/Integer;)V
invokevirtual #17 // Method remove:(Ljava/lang/Object;)V
テストクラス3invokevirtual #10 // Method remove:(Ljava/lang/Object;)V
invokevirtual #10 // Method remove:(Ljava/lang/Object;)V
invokevirtual #10 // Method remove:(Ljava/lang/Object;)V
逆コンパイルコードはいずれも例示的な方法を呼び出すコマンドであることから、結果の自動的な「アップコンバート」はjvmのおかげであると考えられます。jvmは、コンパイル時に呼び出した参照タイプを決定することにより、静的に特定の方法に割り当てられる。前文での戸惑いが解消されたのは、jvmでの静的な分派が実現したため、呼び出し順序はint->Integer->Objectとなっています。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。