Javaデータ型(型)は、プリミティブ型と参照型(参照型)の2つの主要なカテゴリに分類できます。以下は、Java の基本的なデータ型に関する知識を整理するためのパワー ノードです。興味のある友人は一緒に学ぶことができます
1. データ型:
Java ソース コードでは、各変数 が型を宣言する必要があります。 。 Java のデータ型 (型) は、プリミティブ型と参照型の 2 つの主要なカテゴリに分類できます。プリミティブ型には、ブール型と数値型 (数値型) が含まれます。数値型はさらに整数型と浮動小数点型に分類されます。整数には、byte short int long char (char は本質的に int の特殊な型) の 5 種類があります。 浮動小数点型は float と double です。関係は以下のように構成されます。
2. 基本タイプ:
Java は、Java で事前定義され、対応する予約キーワードによって表される基本タイプの言語レベルのサポートを提供します。基本型は単一の値であり、複合オブジェクト ではありません。これは主に効率性を考慮したものですが、基本型のオブジェクト バージョンも提供します。基本タイプのラッパー。これらの基本タイプを直接使用することも、基本タイプを使用して 配列 やその他のカスタム タイプを構築することもできます。プリミティブ型には明示的な値の範囲と数学的な動作があります。 2.1 整数型
整数型には、8、16、32、64、16 ビットで表される byte short int long char が含まれます。場所によっては、char が整数カテゴリに含まれない場合もありますが、基本的に char 型は int のサブセットです。整数の幅は、整数
が占めるメモリ空間のサイズと見なされるべきではなく、整数として定義された変数または式の動作として理解されるべきです。 JVM は、型が仕様に従って動作する限り、必要な量のメモリを自由に使用できます。 Byte short int long はすべて符号付きで、2 の補数で表されます。 Char は 16 ビットで表され、符号なしで UTF-16 エンコーディング セットを表します。
2.1.1 byte
byteは、8ビットの1バイトで表され、最小の整数型
です。主にキーのメモリ領域を節約するために使用されます。バイト タイプは、ネットワーク、ファイル、またはその他の IO からのデータ ストリームを操作する場合に特に便利です。値の範囲は [-128, 127] です。byte のデフォルト値は (byte)0 です。バイト型変数に値の範囲外の値を代入しようとすると、byte b などのコンパイル エラーが発生します。 = 128; このステートメントはコンパイルできません。 public void test(byte b) というメソッドがある場合、興味深い質問です。このメソッドを次のように呼び出そうとするのは間違っています: test(0); コンパイラは、型の互換性がないというエラーを報告します。 ! !バイト b =0 であることは覚えていますが、これはまったく問題ありません。なぜここで問題が発生するのでしょうか?これにはリテラル値という問題があります。リテラル値とは、例えばソースコード中の整数リテラル値は5、0、-200などです。整数の末尾に L または l が追加される場合、リテラル値はlong型になります。たとえば、1000Lはlong型の値を表します。 L または l が追加されていない場合は、int 型になります。基本型のうち、byte short int long は、L を追加せずに整数リテラル (int リテラルと呼びます) で作成できます (たとえば、long 型の場合、サイズが範囲を超える場合は byte short s = 5)。 int が表現できる (32 ビット) は L で終わる必要があります。整数リテラルは、16 進数 [0X または 0x]、10 進数 [なし]、8 進数 [0]、2 進数 [0B または 0b] など、さまざまな方法で表すことができます。バイナリ リテラルは、JDK 7 以降でのみ使用できます。代入操作では、int リテラル値をバイト short int long に代入でき、Java 言語がこのプロセスを自動的に処理します。メソッド呼び出しが異なる場合、test(0) が呼び出されたときに一致できるメソッドは test(int) であり、当然ながら test(byte) メソッドと一致することはできません。なぜ Java がそのようなメソッド呼び出しをサポートしていないのかということです。代入操作をサポートしているため、選択の余地はありません。ラッパーとプリミティブ型の自動変換 (アントボックス化、自動アンボックス化) の違いに注意してください。 byte d = 'A'; も有効で、文字リテラルは 16 ビット整数に自動的に変換できます。 2.1.2 short は 16 で表され、値の範囲は [- 2^15, 2^15 - 1] です。 short はおそらく最も一般的に使用されないタイプです。値は、範囲 (16 ビット) を超えない限り、整数リテラルまたは文字リテラルを介して割り当てることができます。 short 型が操作に参加する場合、これも int 以降の型に昇格されます。 (順序は byte short int long float double)。 2.1.3 int 32 ビット、[- 2^31, 2^31 - 1] の符号付き2 の補数 で表される整数。 loopを制御するためによく使われる式ですが、byteやshortは演算中にint型以上に昇格されることに注意してください。 Java 8 以降では、int 型を使用して符号なし 32 ビット整数 [0, 2^31 - 1] を表すことができます。 2.1.4 long 64 ビット、[- 2^63、2^63 - 1、デフォルト値は 0L]。int では対応できない場合。サイズに合わせてロングタイプもお使いいただけます。長さが十分でない場合は、BigInteger クラスを使用できます。 2.1.5 char 16 ビット、[0, 65535]、[0, 2^16 -1]、「u0000」から「uffff」まで。符号なし、デフォルト値は「u0000」です。 Java は、文字を表すために Unicode 文字セット を使用します。Unicode は、すべての人間の言語の文字を表すことができる完全に国際的な文字セットです。 Unicode は 16 ビット幅を必要とするため、Java の char 型も 16 ビットで表されます。 割り当ては次のようになります: ASCII 文字セットは、Unicode の最初の 127 値を占めます。 char が整数型として分類される理由は、Java が char の算術演算サポートを提供しているためです。たとえば、ch2++ の場合、ch2 は Y になります。 char が加算、減算、乗算、除算の演算を実行すると、int 型にも変換されるため、明示的に変換し直す必要があります。 2.2 浮動小数点型 には、IEEE 754 仕様に従って、それぞれ 32 ビットと 64 ビットで表される単精度 float と倍精度 double が含まれます。 2.2.1 float は、単精度浮動小数点数に対応する 32 ビット表現を使用します。ただし、値が非常に大きいか非常に小さい場合は、不正確になります。 。精度の要件が高くない場合は、宣言型代入の例を使用できます: byte、short、int、long、char を float 型に代入でき、java が自動的に変換を完了します。 2.2.2 double 2.3 ブール型 3. リテラル値 null も 1 つのタイプとみなすことができます。リテラル値は、整数リテラル、浮動小数点リテラル、文字および文字列リテラル、特殊リテラルに大別できます。 3.1. 整型字面值 从形式上看是整数的字面值归类为整型字面值。例如: 10, 100000L, 'B'、0XFF这些都可以称为字面值。整型字面值可以用十进制、16、8、2进制来表示。十进制很简单,2、8、16进制的表示分别在最前面加上0B(0b)、0、0X(0x)即可,当然基数不能超出进制的范围,比如09是不合法的,八进制的基数只能到7。一般情况下,字面值创建的是int类型,但是int字面值可以赋值给byte short char long int,只要字面值在目标范围以内,Java会自动完成转换,如果试图将超出范围的字面值赋给某一类型(比如把128赋给byte类型),编译通不过。而如果想创建一个int类型无法表示的long类型,则需要在字面值最后面加上L或者l。通常建议使用容易区分的L。所以整型字面值包括int字面值和long字面值两种。 3.2. 浮点字面值 浮点字面值简单的理解可以理解为小数。分为float字面值和double字面值,如果在小数后面加上F或者f,则表示这是个float字面值,如11.8F。如果小数后面不加F(f),如10.4。或者小数后面加上D(d),则表示这是个double字面值。另外,浮点字面值支持科学技术法表示。下面是一些例子: 3.3 字符及字符串字面值 Java中字符字面值用单引号括起来,如‘@'‘1'。所有的UTF-16字符集都包含在字符字面值中。不能直接输入的字符,可以使用转义字符,如‘\n'为换行字符。也可以使用八进制或者十六进制表示字符,八进制使用反斜杠加3位数字表示,例如'\141'表示字母a。十六进制使用\u加上4为十六进制的数表示,如'\u0061'表示字符a。也就是说,通过使用转义字符,可以表示键盘上的有的或者没有的所有字符。常见的转义字符序列有: \ddd(八进制) 、 \uxxxx(十六进制Unicode字符)、\'(单引号)、\"(双引号)、\\ (反斜杠)\r(回车符) \n(换行符) \f(换页符) \t(制表符) \b(回格符) 字符串字面值则使用双引号,字符串字面值中同样可以包含字符字面值中的转义字符序列。字符串必须位于同一行或者使用+运算符,因为java没有续行转义序列。 3.4 特殊字面值 null是一种特殊的类型(type),可以将它赋给任何引用类型变量,表示这个变量不引用任何东西。如果一个引用类型变量为null,表示这个变量不可用。 还有一种特殊的class literal,用type name加上.class表示,例如String.class。首先,String是类Class(java.lang.Class)的一个实例(对象),而"This is a string"是类String的一个对象。然后,class literal用于表示类Class的一个对象,比如String.class用于表示类Class的对象String。简单地说,类子面子(class literal)就是诸如String.class 、Integer.class这样的字面值,它所表示的就是累String、类Integer。如果输出Integer.class,你会得到class java.lang.Integer。List.class的输出为interface java.util.List。总之,class literal用于表示类型本身! 3.5 在数值型字面值中使用下划线。 JDK7开始,可以在数值型字面值(包括整型字面值和浮点字面值)插入一个或者多个下划线。但是下划线只能用于分隔数字,不能分隔字符与字符,也不能分隔字符与数字。例如 int x = 123_456_789.在编译的时候,下划线会自动去掉。可以连续使用下划线,比如float f = 1.22_3344.二进制或者十六进制的字面值也可以使用下划线,记住一点,下划线只能用于数字与数字之间,初次以外都是非法的。例如1._23是非法的,_123、11000_L都是非法的。 4. 基本类型之间的转换 我们看到,将一种类型的值赋给另一种类型是很常见的。在Java中,boolean类型与所有其他7种类型都不能进行转换,这一点很明确。对于其他7中数值类型,它们之间都可以进行转换,但是可能会存在精度损失或者其他一些变化。转换分为自动转换和强制转换。对于自动转换(隐式),无需任何操作,而强制类型转换需要显式转换,即使用转换操作符(type)。首先将7种类型按下面顺序排列一下: 如果从小转换到大,可以自动完成,而从大到小,必须强制转换。short和char两种相同类型也必须强制转换。 4.1 自动转换 自动转换时发生扩宽(widening conversion)。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。如果将字面值保存到byte、short、char、long的时候,也会自动进行类型转换。注意区别,此时从int(没有带L的整型字面值为int)到byte/short/char也是自动完成的,虽然它们都比int小。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。 除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。 4.2 强制类型转换 如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。严格地说,将byte转为char不属于narrowing conversion),因为从byte到char的过程其实是byte-->int-->char,所以widening和narrowing都有。强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。强制转换格式如下: 如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如a=256超出了byte的[-128,127]的范围,所以将257除以byte的范围(256)取余数得到b=1;需要注意的是,当a=200时,此时除了256取余数应该为-56,而不是200. 将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。 7种基本类型转换总结如下图: 4.3 赋值及表达式中的类型转换: 4.3.1 字面值赋值 在使用字面值对整数赋值的过程中,可以将int literal赋值给byte short char int,只要不超出范围。这个过程中的类型转换时自动完成的,但是如果你试图将long literal赋给byte,即使没有超出范围,也必须进行强制类型转换。例如 byte b = 10L;是错的,要进行强制转换。 4.3.2 表达式中的自动类型提升 除了赋值以外,表达式计算过程中也可能发生一些类型转换。在表达式中,类型提升规则如下: 》所有byte/short/char都被提升为int。 》如果有一个操作数为long,整个表达式提升为long。float和double情况也一样。
byte型で算術演算を行う場合、式内にdoubleやfloatなどの型がある場合は自動的にint型に昇格されます。したがって、次のコードは間違っています: byte s2 = 'a';
byte sum = s1 + s2;//should cast by (byte)</span></span></span>
char ch1 = 88;
char ch2 = 'A';
f1 = 10L;
f1 = 10.0f;
//f1 = 10.0;默认为double</span></span></span>
double d2 = 11.4;
double d3 = 1.23E3;
double d4 = 10D;
double d5 = 0.4D;
float f1 = 10;
float f2 = 11.1F;
float f3 = 1.23e-4F;
float f4 = 1.23E0F;</span>
byte <(short=char)< int < long < float < double
》int--> float
》long--> float
》long--> double
》float -->double without strictfp
byte b;
b = (byte)a;//1</span>
以上がJava基本データ型グラフィックコードの詳細解説(パワーノード配置)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。