从零开始学Java Web开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 数据类型

Java语言是强类型语言,在程序中每个变量都具有数据类型。Java提供2大类数据类型,一类是基本数据类型(Primitive Type),一类是引用数据类型(Reference Type)。其中,基本数据类型包括:整数类型、浮点类型、字符类型、布尔类型。引用数据类型包括:类、接口、数组。这些数据类型的具体关系如下所示。

2.2.1 基本数据类型

基本数据类型也称为简单数据类型,代表程序中的简单的值,而不是复杂的对象。Java是完全面向对象的语言,但其基本数据类型不是,它类似于其他非面向对象语言中的简单数据类型,引入基本数据类型主要是对于执行效率的考虑。

在数学中可以将数值分为自然数、小数、有理数、无理数等类型。而在Java程序中,数值需要在内存中分配一块空间,用来存放它,程序中数值的改变其实就是存储区域中存放内容的改变。但是应该为每个数值分配多大的空间呢?一个很大的数值分配一个很小的存储空间将会溢出,而一个很小的数值分配一个很大的存储空间,将会造成内存空间的浪费。因此,在程序中数值变化的范围就通过数据类型来体现,从而为不同的数据类型分配不同的存储空间。

Java中定义了8个基本数据类型,这些类型可分为以下4组。

❑ 整数类型:字节型(byte)、短整型(short)、整型(int)、长整型(long)。

❑ 浮点数类型:浮点型(float)、双精度型(double)。

❑ 字符类型:字符型(char)。

❑ 布尔类型:布尔型(boolean)。

说明

Java中类型的标识都是小写字母,其中整数和浮点数都是有符号数的。

1.整数类型

Java中定义了4个整数类型:字节型(byte)、短整型(short)、整型(int)、长整型(long),这些都是有符号的数。整数数据类型所占存储空间和表示的范围如表2.3所示。

表2.3 整数数据类型

下面列举了各种整数类型的实例。

❑ 十进制整数:123、-456、0。

❑ 八进制整数:0123、-011(以数字0开头,0123表示十进制数83,-011表示十进制数-9。)

❑ 十六进制整数:0x123(以0x或0X开头,0x123表示十进制数291。)

❑ long类型常值:123L(整型常值占32位,如果要定义一个long类型常值,则要在数字后加字母L(或者小写形式l),如123L表示一个长整数占64位。)

2.浮点数类型

Java中定义了2个浮点类型:单精度浮点型(float)和双精度浮点型(double),这些也都是有符号的数,浮点数数据类型所占存储空间和表示的范围如表2.4所示。

表2.4 浮点数数据类型

下面列举了各种浮点数类型的实例。

❑ 十进制数形式:0.123、.123、123.、123.0(由数字和小数点组成,必须有小数点。)

❑ 科学计数法形式:123e3、123E3(e或E之前必须有数字,且e或E后面必须有整数,表示10的幂次。)

❑ float类型常值:12.3F(浮点常数在机器中占64位,对于float型的常值,则要在数字后加f或F,如12.3F表示一个单精度浮点常数占32位,表示精度较低。)

3.字符类型

Java定义了存储字符的数据类型char,该类型长度是16位,其表示范围是0~65536。字符类型的值是用单引号括起来的单个字符,例如‘b’、‘B’,此外Java还提供转义字符,转义字符以反斜杠“\”开头,将其后的特殊字符转变为表示的相应字符,Java中常用的转义字符如表2.5所示。

表2.5 Java中常用转义字符

4.布尔类型

布尔类型是Java中定义的表示逻辑真假值的基本类型,用来作为关系运算或逻辑运算的返回类型。它的值只能是true或false这两个关键字中的一个。该类型的长度只有1位,在计算机中用0和1来表示。

2.2.2 引用数据类型

引用数据类型也称为复杂数据类型,表示“类”类型,“类”的详细概念将在本书第3章中详细介绍,引用数据类型既可以是Java中本身提供的系统类,也可以是用户自定义的任何类。引用数据类型的变量用来引用类的实例对象。

说明

引用数据类型的首字母一般都是大写的,这与基本数据类型是有区别的。

在Java中最常用的引用数据类型是String类型,它是表示字符串数据的类型,该类型的值是用双引号括起来的,声明String类型变量的示例如下:

    String userName=”Tom”;       //定义了名为userName的字符串变量,赋初值“Tom”
    String name=””;              //定义了名为name的字符串变量,赋初值“”,即空字符串

Java中的8个基本数据类型也有相对应的引用数据类型,它们是基本数据类型的封装类,在具体编码时要特别注意区分,这些封装类除了包含相关数据信息外,还包含了对相关数据的操作方法,基本数据类型与封装类的对应信息如表2.6所示。

表2.6 基本数据类型与封装类

说明

基本数据类型的封装类不具备基本数据类型的运算法则,例如,两个int型的变量可以进行加法运算,而两个Integer类的对象却不可以直接进行加法运算。

2.2.3 数据类型间的转换

Java语言中数据类型的转换分为自动类型转换和强制类型转换两种,下面主要讨论基本数据类型的数据转换。

1.自动类型转换

Java中要实现自动类型转换,必须满足以下2个条件。

❑ 实现转换的两种类型是兼容的。

❑ 目的类型的范围比源类型大。

例如,int与byte类型都是整数类型,int的范围比byte范围大,因此将byte类型的变量转换为int类型将进行自动类型转换,自动类型转换是不需要任何显式的声明的。

byte类型自动转int类型的示例代码如下:

    byte b=36;
    int i=b;                 //自动类型转化不要任何声明

自动类型转换除了可以在整数类型之间、浮点数类型之间进行之外,将整数类型向浮点数类型转换也是可以的,只要被转换的整数类型数据包含在相关浮点数范围之内即可。除了数值类型之间的转换之外,字符类型char也可向int和long类型做自动类型转换,但是数据表示的意义不再是一个字符而是对应字符的Unicode编码,例如,下面代码表示将字符“b”转化成int类型,转换后其值变为“98”。

    char c=’b’;
    int i=c;                  //自动类型转化不要任何声明
    System.out.print(i);      //输出值为98

2.强制类型转换

自动类型转换适合于兼容类型之间从小范围数据类型转换成大范围数据类型,而在编程过程中,经常要把兼容类型的大范围数据类型转换成小范围的,例如,把short类型数据转换为byte类,这样将可能造成数据丢失,因此必须采用强制类型转换来实现。强制类型转换语法格式为:

    (类型名)变量名

例如,下面代码实现了从short类型强制转换为int类型的功能。

    short s=25;
    byte b=(byte)s;           //强制类型转化声明short类型转化为byte类型
    System.out.print(b);      //输出值为25