Java有八大基本类型,其中包括4个整数类型,2个浮点类型,有个字符类型,1个布尔类型
八大基本类型及其包装类
- 整数类型byte、short、int和long
byte:字节型;short:短整型;int:整型;long:长整型。
刚开始学习时有种疑惑,为啥弄这么多整数类型?
从字节型到长整型,整数的范围总是在不断增加,不够用了自然就要扩展范围,添加新的类型;若范围小的整数浪费空间太多,又会影响程序,所以在使用时就有了类型供我们选择。
- 浮点型float和double
float是单精度浮点数,double是双精度浮点数;double类型要比float类型的精度更高。
举个栗子:分别向一个float和double类型的变量中存入圆周率,打印结果
public class PrintRange {
public static void main(String[] args) {
float a = 3.14159265358979323846F;
double b = 3.14159265358979323846;
System.out.println(a);
System.out.println(b);
}
}
输出结果
- 字符型char
Java采用的是Unicode编码格式,字符类型的变量不仅可以接收单字符常量,还可以接收0~65535
之间的整数。
转义字符表(有些特殊含义的字符需要通过\
来协助)
- 布尔型boolean
Java中的布尔型只表示字面true和false,不同C++之处,如果将一个整数值赋值给布尔类型变量,编译器将报错。
- Java常量默认类型
在Java中整型常量默认int类型,如果想要使用long类型常量,需要在常量后添加L/l
字符,例如:15L
浮点数默认为double类型,如果想要float类型需要添加F/f
,例如:3.14F
Tips: 添加后缀字符来辅助编译器快速识别常量的类型,这种后缀字符有时可有可无,有时却必须强制我们使用。
- 基本类型的范围
我们可以利用基本类型的包装类中的关键字MAX_VALUE
和MIN_VALUE
,打印出基本类型的范围。
public class PrintRange {
public static void main(String[] args) {
System.out.println("byte: "+Byte.MIN_VALUE+" ~ "+Byte.MAX_VALUE);
System.out.println("short: "+Short.MIN_VALUE+" ~ "+Short.MAX_VALUE);
System.out.println("int: "+Integer.MIN_VALUE+" ~ "+Integer.MAX_VALUE);
System.out.println("long: "+Long.MIN_VALUE+" ~ "+Long.MAX_VALUE);
System.out.println("float: "+Float.MIN_VALUE+" ~ "+Float.MAX_VALUE);
System.out.println("double: "+Double.9+" ~ "+Double.MAX_VALUE);
System.out.println("char: "+Character.MIN_VALUE+" ~ "+Character.MAX_VALUE);
}
}
- 基本类型越界行为
注:这里讨论的越界行为只针对于整型变量(即byte,short,int,lang)
举个栗子
我们看到变量 a 是强制赋值一个越界的整数(需要强制转换),输出结果确是Byte.MIN_VALUE
(128比最大值多了1);变量 b 是通过加法运算越界,结果也是 Integer.MIN_VALUE
变量越界后,输出的是错误结果,但是我们如何计算这个错误结果呢?
举个栗子
计算方法(根据MAX_VALUE+1 = MIN_VALUE
):
Integer.MAX_VALUE+10000 = 2147483647+10000 = 2147483647 + 1 + 9999
=Integer.MIN_VALUE + 9999 = -2147483648 + 9999 = -2147473649 (计算出了错误结果)
Tips: 不论是其他算术运算导致过界,还是赋值中导致过界(大范围强制赋值给小范围)都可以这样计算
基本类型间的相互转换
- 隐式转换
范围小的类型可以自动转换为范围大的类型,大范围类型能容纳小范围类型(也称显示转换为扩展转换)这些转换都是兼容的。
byte → short → int → long → float → double;char → int
- 显示转换
大的范围转换为小范围类型,会造成信息丢失(也称隐式转换为窄化转换),不兼容性转换。如图,利用类型转换操作符(cast)
进行显示转换。
浮点数转换为整数的小数问题
float和double类型转换为整数时,总是舍去小数点后面的部分,称此行为为截尾。
如果对小数点后面的部分进行四舍五入,即舍入操作,需要利用java.lang.Math中的round()方法
基本类型和包装类之间的转换
- 自动装箱和拆箱
Java5出现的特性,基本类型和封装类之间可以进行自动拆箱和装箱进行类型转换(由基类转换为包装类)。
包装类中还包含很多将包装类装换为其他基类的接口,详细的可以查看Java API文档
- 基本类型和String类型之间的转换
在我们进行Java GUI界面开发时,通常会获取文本输入框的值,这就可能涉及到String类型转换为基本类型的问题。
public class PrintRange {
public static void main(String[] args) {
//基类转换为String类型
int a = 125;
String s = String.valueOf(a);
//String类型转换为基类
a = Integer.parseInt(s);
}
}
String转换为基类利用的是基类对应包装类的parse···
方法,基类转换字符串用的是String类中的valueOf
方法,这些在Java API中都有介绍。
基本类型作为方法参数传递中的转换
举个栗子
自动转换发生在在重载方法中,要注意方法的选择。
public class Transboundary
{
public void f(int a){System.out.println("f(int)");}
public void f(short c){System.out.println("f(short)");}
public static void main(String[] args){
Transboundary transboundary = new Transboundary();
transboundary.f((byte)1);
}
}
Tips: 在重载方法中,会自动选择调用离实参类型范围比较近的方法。
运算中的类型中转换
- 范围小于int类型的变量会先转换为int型变量再进行运算,例如short、byte类型。
- 范围小的和范围大的参与运算,会先转换为范围大的再进行运算。
拓展:特殊的基本类型void
在一些书中将void划归为基本类型,void类型的封装类Void的确在java.lang包中。