Java基本数据类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。
简单类型 | boolean | byte | char | short | int | long | float | double |
二进制位数 | 1 | 8 | 16 | 16 | 32 | 64 | 32 | 64 |
封装类 | Boolean | Byte | Char | Short | Integer | Long | Float | Double |
Java基本类型存储在栈中,因此它们的存取速度要快于存储在堆中的对应包装类的实例对象。从Java5.0(1.5)开始,JAVA虚拟机(JVM)可以完成基本类型和它们对应包装类之间的自动转换。因此我们在赋值、参数传递以及数学运算的时候像使用基本类型一样使用它们的包装类,但这并不意味着你可以通过基本类型调用它们的包装类才具有的方法。另外,所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。
Java的常量
1. 十六进制整型常量:以十六进制表示时,需以0x或0X开头,如0xff,0X9A。
2. 八进制整型常量:八进制必须以0开头,如0123,034。
3. 长整型:长整型必须以L作结尾,如9L,342L。
4. 浮点数常量:由于小数常量的默认类型是double型,所以float类型的后面一定要加f(F)。同样带小数的变量默认为double类型。
看到这里,大家都清楚了Java的基本数据类型有哪些,下一个问题就是这些类型是否有相互之间的转换关系,有的话是什么样子的,下面就来说这个问题。
(1)自动转换(隐式转换)。自动类型转换是指:数字表示范围小的数据类型可以自动转换成范围大的数据类型。
如果以下 2 个条件都满足,那么将一种类型的数据赋给另外一种类型变量的时,将执行自动类型转换(automatic type conversion)。
其中实线表示 自动转换时不会造成数据缺失,虚线却有这个隐患。
例如:
byte a = 2;
int b = a;
short a = 2;
int b = a;
自动类型提升有好处,但它也会引起令人疑惑的编译错误。例如,下面看起来正确的程序却会引起问题:
byte b = 50; b = b * 2; // Type mismatch: cannot convert from int to byte
如上所示,第二行会报“类型不匹配:无法从int转换为byte”错误。java的默认整数类型是 int
该程序试图将一个完全合法的 byte 型的值 50*2 再存储给一个 byte 型的变量。但是当表达式求值的时候,操作数被自动的提升为 int 型,计算结果也被提升为 int 型。这样表达式的结果现在是 int 型,不强制转换它就不能被赋为 byte 型。确实如此,在这个特别的情况下,被赋的值将仍然适合目标类型。
所以应该使用一个显示的强制类型转换,例如:
byte b = 50; b = (byte)(b*2);
这样就能产生正确的值 100。
类似情况还有:
short s1 = 10; s1 = s1 + 12;//错误: 不兼容的类型: 从int转换到short可能会有损失
应该改为:
short s2 = 10; s2 += 12; // 等同于short s2 = (short)(s2 + (short)1); //正确
注意:char 类型比较特殊,char 自动转换成 int、long、float 和 double,但 byte 和 short 不能自动转换为 char,而且 char 也不能自动转换为 byte 或 short。
(2)强制转换(显式转换)
尽管自动类型转换是很有帮助的,但并不能满足所有的编程需要。例如,如果你需要将 double 型的值赋给一个 int 型的变量的时候。
这种转换不会自动进行,因为 double 型的变化范围比 int 型的要小。这种转换有使成为“缩小转换”,因为你肯定要将源数据类型的值变小才能适合目标数据类型。
所以,强制转换的使用情况:当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。
语法格式为:(type)variablename
其中,type 为 variableName 要转换成的数据类型,而 variableName 是指要进行类型转换的变量名称,强制转换的实例如下:
int a = 3; double b = 5.0; a = (int)b;
上述代码中首先将 double 类型变量 b 的值强制转换成 int 类型,然后将值赋给 a,但是变量 b 本身的值是没有发生变化的。
在强制类型转换中,如果是将浮点类型的值转换为整数,直接去掉小数点后边的所有数字;而如果是整数类型强制转换为浮点类型时,将在小数点后面补零。
综上所述,我们学习了Java的基础类型以及数据类型的转换,如有不足,以后还会进行补全。
原文:https://www.cnblogs.com/bardzx/p/12091653.html