JAva元のデータ型ケース
2937 ワード
Javaの元のデータ型といえば、多くのjavaプログラマーが簡単だと思っているかもしれませんが、javaの元のデータ型について本当に知っていますか?必ずしもそうではないようですが、次のプログラムは、開発経験の長いプログラマーでもよく説明できるとは限らないと信じています.もちろん、私も依然として勉强の过程の中で、どこか解釈の正しくないことがあって指正を歓迎します.
まず簡単な例を示します.
上記の例は簡単で、shortタイプ変数sに初期値を付与します.しかし、なぜ間違いがないのでしょうか.定数値2はintタイプではないでしょうか.intタイプの値をshortタイプの値に変換するのは強制的に変換すべきではないでしょうか.なぜintタイプの値をshortタイプの値に変換してもエラーはありませんか?次に、このコードのバイトコードを示します.
バイトコードではiconst_のみが呼び出されていることがわかります.2(スタックの上部に2を押し込む)とistore_1(スタックトップの内容をsに格納する).割り当て中にintタイプの定数値しか存在しないため、コンパイラはどのように処理するか知っています.△この部分はよくわかりませんが、大侠に説明してもらいます.
コードを見てみましょう.
上記のコードでは、sの値を計算するときに結果を強制的にタイプ変換する必要がありますが、次のように書くとコンパイルエラーが発生します.
これは、+オペレータには2つのオペランドがあり、JVM命令の+オペレータの最小タイプはintであり、他のbyte、short、charはiload、iaddで操作され、i 2 b、i 2 s、i 2 cで変換されます.+操作は2つの数の間にあるので、手動で変換しないと、コンパイラは最初のオペランドタイプに変換するか、2番目のオペランドタイプに変換するか分かりません.このコードのバイトコードは次のとおりです.
次のコードは、強制的なタイプ変換を必要とせずに正しく実行できます.
バイトコードを確認すると、コンパイラは自動的にタイプ変換を実行します.
したがって、単純に見える元のデータ型は簡単ではなく、研究に専念する必要があります.上の説明はまだ詳しくありません.私もこの方面の研究を始めたばかりなので、これからも絶えず改善します.何か間違いがあれば、よろしくお願いします.
まず簡単な例を示します.
public class PrimitiveDataTypeTest {
public static void main(String[] args) {
short s = 2;
}
}
上記の例は簡単で、shortタイプ変数sに初期値を付与します.しかし、なぜ間違いがないのでしょうか.定数値2はintタイプではないでしょうか.intタイプの値をshortタイプの値に変換するのは強制的に変換すべきではないでしょうか.なぜintタイプの値をshortタイプの値に変換してもエラーはありませんか?次に、このコードのバイトコードを示します.
public com.ygc.PrimitiveDataTypeTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: return
}
バイトコードではiconst_のみが呼び出されていることがわかります.2(スタックの上部に2を押し込む)とistore_1(スタックトップの内容をsに格納する).割り当て中にintタイプの定数値しか存在しないため、コンパイラはどのように処理するか知っています.△この部分はよくわかりませんが、大侠に説明してもらいます.
コードを見てみましょう.
public class PrimitiveDataTypeTest {
public static void main(String[] args) {
short s = 2;
s = (short) (s + 1);
}
}
上記のコードでは、sの値を計算するときに結果を強制的にタイプ変換する必要がありますが、次のように書くとコンパイルエラーが発生します.
public class PrimitiveDataTypeTest {
public static void main(String[] args) {
short s = 2;
s = s + 1;
}
}
これは、+オペレータには2つのオペランドがあり、JVM命令の+オペレータの最小タイプはintであり、他のbyte、short、charはiload、iaddで操作され、i 2 b、i 2 s、i 2 cで変換されます.+操作は2つの数の間にあるので、手動で変換しないと、コンパイラは最初のオペランドタイプに変換するか、2番目のオペランドタイプに変換するか分かりません.このコードのバイトコードは次のとおりです.
Compiled from "PrimitiveDataTypeTest.java"
public class com.ygc.PrimitiveDataTypeTest extends java.lang.Object{
public com.ygc.PrimitiveDataTypeTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: i2s
6: istore_1
7: return
}
次のコードは、強制的なタイプ変換を必要とせずに正しく実行できます.
public class PrimitiveDataTypeTest {
public static void main(String[] args) {
short s = 2;
s += 1;
}
}
バイトコードを確認すると、コンパイラは自動的にタイプ変換を実行します.
Compiled from "PrimitiveDataTypeTest.java"
public class com.ygc.PrimitiveDataTypeTest extends java.lang.Object{
public com.ygc.PrimitiveDataTypeTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: i2s
6: istore_1
7: return
}
したがって、単純に見える元のデータ型は簡単ではなく、研究に専念する必要があります.上の説明はまだ詳しくありません.私もこの方面の研究を始めたばかりなので、これからも絶えず改善します.何か間違いがあれば、よろしくお願いします.