Java有八大基本类型,其中包括4个整数类型,2个浮点类型,有个字符类型,1个布尔类型

八大基本类型及其包装类

JAVA八大基本类型 java中的八种基本类型_基本类型

- 整数类型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);
	}
}

输出结果

JAVA八大基本类型 java中的八种基本类型_JAVA八大基本类型_02

- 字符型char

Java采用的是Unicode编码格式,字符类型的变量不仅可以接收单字符常量,还可以接收0~65535之间的整数。

转义字符表(有些特殊含义的字符需要通过\来协助)

JAVA八大基本类型 java中的八种基本类型_Java_03

- 布尔型boolean

Java中的布尔型只表示字面true和false,不同C++之处,如果将一个整数值赋值给布尔类型变量,编译器将报错。

- Java常量默认类型

在Java中整型常量默认int类型,如果想要使用long类型常量,需要在常量后添加L/l字符,例如:15L
浮点数默认为double类型,如果想要float类型需要添加F/f,例如:3.14F

Tips: 添加后缀字符来辅助编译器快速识别常量的类型,这种后缀字符有时可有可无,有时却必须强制我们使用。

- 基本类型的范围

我们可以利用基本类型的包装类中的关键字MAX_VALUEMIN_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);
	}
}

JAVA八大基本类型 java中的八种基本类型_Java_04

- 基本类型越界行为

注:这里讨论的越界行为只针对于整型变量(即byte,short,int,lang)

举个栗子

JAVA八大基本类型 java中的八种基本类型_JAVA八大基本类型_05


我们看到变量 a 是强制赋值一个越界的整数(需要强制转换),输出结果确是Byte.MIN_VALUE(128比最大值多了1);变量 b 是通过加法运算越界,结果也是 Integer.MIN_VALUE变量越界后,输出的是错误结果,但是我们如何计算这个错误结果呢?

举个栗子

JAVA八大基本类型 java中的八种基本类型_Java_06


计算方法(根据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

JAVA八大基本类型 java中的八种基本类型_基本类型_07

- 显示转换

大的范围转换为小范围类型,会造成信息丢失(也称隐式转换为窄化转换),不兼容性转换。如图,利用类型转换操作符(cast)进行显示转换。

JAVA八大基本类型 java中的八种基本类型_Java_08


浮点数转换为整数的小数问题

float和double类型转换为整数时,总是舍去小数点后面的部分,称此行为为截尾。
如果对小数点后面的部分进行四舍五入,即舍入操作,需要利用java.lang.Math中的round()方法

基本类型和包装类之间的转换

- 自动装箱和拆箱

Java5出现的特性,基本类型和封装类之间可以进行自动拆箱和装箱进行类型转换(由基类转换为包装类)。

JAVA八大基本类型 java中的八种基本类型_Java_09


包装类中还包含很多将包装类装换为其他基类的接口,详细的可以查看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中都有介绍。

基本类型作为方法参数传递中的转换

举个栗子

JAVA八大基本类型 java中的八种基本类型_java_10


自动转换发生在在重载方法中,要注意方法的选择。

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);
	}
}

JAVA八大基本类型 java中的八种基本类型_Java_11


Tips: 在重载方法中,会自动选择调用离实参类型范围比较近的方法。

运算中的类型中转换

  1. 范围小于int类型的变量会先转换为int型变量再进行运算,例如short、byte类型。
  2. 范围小的和范围大的参与运算,会先转换为范围大的再进行运算。

拓展:特殊的基本类型void

在一些书中将void划归为基本类型,void类型的封装类Void的确在java.lang包中。