Java—不可不知的数据分类法—数据类型

数据类型的意义

为什么要有数据类型?在回答这个问题之前,我们先温习下先贤孔子在《论语·阳货》里的一句话:“子之武城,闻弦歌之声。夫子莞尔而笑,曰:‘割鸡焉用牛刀。

’”据此,衍生了中国一个著名的成语——“杀鸡焉用宰牛刀”?这是疑问句式。是的,杀鸡的刀用来杀鸡,宰牛的刀用来宰牛,用宰牛的刀杀鸡,岂不大材小用?

杀鸡的刀和宰牛的刀虽然都是刀,但属于不同的类型,如果二者混用,要么出现“大材小用”,要么出现“不堪使用”的情况。由此,可以看出,正是有了类型的区分,我们才可以根据不同的类型,确定其不同的功能,然后“各司其职”,不出差错。
在这里插入图片描述
除了不同类型的“刀”承担的功能不一样,而且如果我们给“杀鸡刀”和“宰牛刀”各配一个刀套,刀套的大小也自然是不同的。“杀鸡刀”放到“宰牛刀”的刀套里,势必空间浪费,而“宰牛刀”“放到杀鸡刀”的刀套里,势必放不下。在必要时,“宰牛刀”“经过打磨,可以做成“杀鸡刀”。

从哲学上来看,很多事物的表象千变万化,而其本质却是相同。类似的,在Java语言中,每个变量(常量)都有其数据类型。不同的数据类型可允许的操作也是不同的。比如,对于整型数据,它们只能进行加减乘除和求余操作。此外,不同的数据占据的内存空间大小也是不尽相同的。而在必要时,不同的数据类型也是可以做到强制类型转换的。

程序,本质上就是针对数据的一种处理流程。那么,针对程序所能够处理的数据,就是程序语言的各个数据类型划分。正是有了各种数据类型,程序才可以“有的放矢”进行各种不同数据操作。

在Java之中数据类型一共分为两大类:基本数据类型、引用数据类型。由于引用数据类型较为难理解,所以针对于此部分的内容,这里暂不作讨论,讨论的是基本数据类型。在Java中规定了8种基本数据类型变量来存储整数、浮点数、字符和布尔值,如下图所示。
在这里插入图片描述
一个变量就如同一个杯子或一个容器,在其内要装载某个特定的数值(如同杯子里可盛水或咖啡等)。杯子有大有小,杯子里装的水(咖啡)也有多有少。同样,不同类型的变量,其能表示的数据范围也是不同的。Java的基本数据类型占用内存位数及可表示的数据范围如下表所示。
在这里插入图片描述

整数类型

整数类型(Integer),简称整型,表示的是不带有小数点的数字。例如,数字10、20就表示一个整型数据。在Java中,有4种不同类型的整型,按照占据空间大小的递增次序,分别为byte(位)、short(短整型)、int(整数)及long(长整数)。在默认情况下,整数类型是指int型,那么下面先通过代码来观察一下。

举例来说,想声明一个短整型变量sum时,可以在程序中做出如下的声明。
在这里插入图片描述
经过声明之后,Java即会在可使用的内存空间中,寻找一个占有2个字节的块供sum变量使用,同时这个变量的范围只能在-32768 到 32767之间。

byte类型

在Java中,byte类型占据1字节内存空间,数据的取值范围为-128 ~ 127。
在这里插入图片描述
在这里插入图片描述
每种基本的数据类型都有几个静态属性,如MAX_VALUE(最大值)、MIN_VALUE(最小值)、SIZE(大小)、TYPE(类型)等。要得到这些值,可用名称为该类型首字母大小对象(如byte类型对应Byte对象)通过点(.)操作符将其读取出来,参见代码05行。Byte 类将基本类型 byte 的值包装在一个对象中。一个Byte 类型的对象只包含一个类型为 byte 的字段。Byte类常见的静态属性如下表所示。
在这里插入图片描述

short类型

short类型数据占据2个字节内存空间,取值范围为-32768 ~ 32767。

short类型数据的使用(代码shortdemo.java)
在这里插入图片描述
在这里插入图片描述
代码05行的功能就是获得短整数所能表达的最大数值(Short.MAX_VALUE)。

int类型

int类型数据占据4个字节内存空间,取值范围为-2147483648 ~ 2147483647。

int类型数据的使用(intdemo.java)
在这里插入图片描述
在这里插入图片描述
代码05行的功能就是获得短整型所能表达的最大数值(Integer.MAX_VALUE)。由于java.lang包是Java语言默认加载的,所以第05行的语句可以简化为被注释的第06行。lang是language(语言)的简写。

由于每一种类型毕竟都有其对应范围的最大或最小值,那么如果说在计算的过程之中,超过了此范围(大于最大值或小于最小值),那么就会产生数据的溢出问题。请参见如下的范例,整型数据的溢出(ShotDemo2.java)。
在这里插入图片描述
在这里插入图片描述
第07、08行分别输出int类型的最大值和最小值。那么比int类型的最大值还大1是什么值?比int类型的最小值还小1的是什么值?第09行和第11行分别给出了答案,比int类型的最大值还大1是最小值,而int类型的最小值还小1的是最大值。这里的最大值、最小值的转换是不是有点中国哲学里“物极必反,否极泰来”的味道呢?数据最大值、最小值会出现一个循环过程,这种情况就称为数据溢出(overflow)。

long类型

long类型数据占据8个字节内存空间,取值范围为-9223372036854775808 ~9223372036854775807。

long类型数据的使用(LongDemo.java)。
在这里插入图片描述
在这里插入图片描述
范例第05行定义长整型long_max,并将系统定义好的java.lang.Long.MAX_VALUE赋给这个变量。第07行输出这个值。

我们演示了整型数据的数据溢出问题,而要想解决数据的溢出问题,那么最好的做法是扩大数据的操作范围,比int范围大的是刚刚讲到的long类型,所以可将其扩充为long,有两种方式扩充。

⑴ 直接在数据前增加一个“(long)”;

⑵ 直接在数据后增加一个字母“L”。

使用long类型解决int类型溢出问题(LongDemo.java)

在这里插入图片描述
在这里插入图片描述
第09行,数字1前面的long表示把1强制转换为长整型(默认情况下1为普通整型int),为了不丢失数据的精度,低字节类型数据与高字节数据运算,其结果自动转变为高字节数据,因此,int型与long型运算的结果是 long型数据。

第10行和第11行,整型数据2和1后的字母“L”也达到把2和1转变为长整型的效果。

浮点类型

Java浮点数据类型主要有双精度double和单精度float两个类型。

double类型:共8个字节,64位,第1位为符号位,中间11位表示指数,最后52位为尾数。float类型:共4个字节,32位,第1位为符号位,中间8位表示指数,最后23位表示尾数。

float类型

下面举一个简单的例子。在程序中,声明一个float类型的变量num,并赋值为3.0,将num*num的运算结构输出到显示器上。

浮点类型的使用(floatDemo.java)
在这里插入图片描述
在这里插入图片描述
需要注意一点,含小数的实数默认为double类型数据,如果定义的是float型数据,为其赋值的时候,必须要执行强制转型,有两种方式。

⑴ 直接加上字母“F”,或小写字母“f”,例如:“float data = 1.2F ;”或“float data = 1.2f”。

⑵ 直接在数字前加强制转型为“float”,例如:“float data2 = (float) 1.2 ;”。

06行定义了一个float类型变量num,并赋值为3.0f。其中3.0后的字母“f”其实就是上面讲到的第一种强制类型转换。07行将num做了简单的乘法运算输出。

double类型

当浮点数的表示范围不够大的时候,还有一种双精度(double)浮点数可供使用。双精度浮点数类型的长度为64个字节,有效范围为 在这里插入图片描述
Java提供了浮点数类型的最大值与最小值的代码,其所使用的类全名与所代表的值的范围,可以在下表中查阅。
在这里插入图片描述
类似的,在类全名中,可以省去类库java.lang,直接取用类名称即可。下面的程序是输出float与double两种浮点数类型的最大与最小值,可以将下面程序的输出结果与上表一一进行比较。

取得单精度和双精度浮点数类型的最大、最小值(doubleAndFloatDemo. java)。
在这里插入图片描述
在这里插入图片描述
下面为声明与设置float与double类型的变量时应注意的事项。
在这里插入图片描述

字符类型(char)

字符,顾名思义,就是字母和符号的统称。字符类型在内存中占有2个字节,定义时语法为。
在这里插入图片描述
直接给字符类型赋值(charDemo.java)
在这里插入图片描述
在这里插入图片描述
需要注意的是:字符要用一对单引号(’ ')括起。但如果把一个字符变量赋值成一个单引号,就会出问题,这样就有了转义字符的概念。转义字符就是用不容易混淆的字符来代替那些敏感字符,它们作为一个整体使用。

下表为常用的转义字符
在这里插入图片描述
以下面的程序为例,将ch赋值为’"’(要以单引号(’)包围),并将字符变量ch输出在显示器上,同时在打印的字符串里直接加入转义字符,可自行比较一下两种方式的差异。

转义字符的使用(EscapeChar.java)
在这里插入图片描述
在这里插入图片描述
总结可以得知,不管是用变量存放转义字符,还是直接使用转义字符的方式来输出字符串,程序都可以顺利运行。由于使用变量会占用内存资源,因此似乎显得有些不妥;当然也可以不必声明字符变量就输出转义字符,但如果在程序中加上太多的转义字符,以至于造成混淆而不易阅读时,利用声明字符变量的方式就是一个不错的选择。

但是需要注意的是,Java之中默认采用的编码方式为Unicode编码,此编码是一种采用十六进制编码方案,可以表示出世界上的任意的文字信息。所以在Java之中单个字符里面是可以保存中文字符的,一个中文字符占据2个字节。这点是与C/C++对字符型的处理是有区别的,在C/C++中,中文字符只能当作字符串处理。

单个中文字符的使用(ChineseChar.java)
在这里插入图片描述
在这里插入图片描述
值得注意的是,char和int型数据的互相转型问题。遵循C语言常用的ASCII码的习惯,字母的表示范围是:大写字母A~Z对应整数65 ~ 90、小写字母a~z对应整数97 ~ 122、字符0~9对应整型数49 ~ 57,由此可以发现,大写字母和小写字母之间的差是32个长度,如果按照此规律,就可以轻易的编写一个大小写的转换操作。

提示
ASCII(American Standard Code for Information Interchange,美国标准信息交换码)是计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定,已被国际标准化组织(ISO)定为国际标准。

单个英文字符与ASCII(整型值)的转换(CharToInt.java)
在这里插入图片描述
在这里插入图片描述
范例07行,字符c直接给整型变量赋值x,此时x的值就是c对应的ASCII码值,也就是65,第08行输出这个结果。

范例第09行,整型变量x值增加32,也就是97,此值正是小写字母‘a’的ASCII值。第10行将x强制类型转换为字符型,第11行输出该字符‘a’。

布尔类型(boolean)

布尔(Boolean)本是一位英国数学家的名字。在Java中使用关键字boolean来声明布尔类型。被声明为布尔类型的变量,只有true(真)和false(假)两种。除此之外,没有其他的值可以赋值给这个变量。

布尔类型主要用于逻辑判断,就如我们日常生活中的“真”和“假”一样。比如,我们可以用布尔类型来表示某人的性别,“张三”是否是“男人”?如下图所示。
在这里插入图片描述
若想声明名称为Zhang3IsMan的变量为布尔类型,并设置为true值,可以使用下面的语句。
在这里插入图片描述
经过声明之后,布尔变量的初值即为true,当然如果在程序中需要更改status的值时,即可随时更改。将上述的内容写成了程序booleanDemo,可以先熟悉一下布尔变量的使用。

布尔值类型变量的声明(booleanDemo.java)
在这里插入图片描述
在这里插入图片描述
第07行定义一个布尔变量Zhang3IsMan,并赋值为true。第08行输出这个判断。

特别注意的是,Zhang3IsMan不能赋值为0或者1,或者其他整数,编译器将不予通过。

布尔值通常用来控制程序的流程

数据类型的转换

Java有严格的数据类型限制,每种数据类型都有其独特的特性。这些不同的数据类型所定义的变量,它们之间的类型转换不是轻易完成的。但在特殊情况下,还是需要进行类型转换的操作,但必须遵循严格的步骤和规定。数据类型的转换方式可分为“自动类型转换”及“强制类型转换”两种。下面分别给予讨论。

自动类型转换

在程序中已定义好了数据类型的变量,若想转换用另一种数据类型表示时,Java会在下面2个条件皆成立时,自动进行数据类型的转换。

⑴ 转换前后的数据类型要相互兼容。在C/C++中,整型和布尔类型的关系是 “非零即为真”——凡是不是零的整数都可以认为是布尔值为真变量,二者是兼容的,所以可以相互转换。而在Java中,由于boolean类型只能存放true或flase,与整数及字符不兼容,因此boolean类型不可能与其他任何数据类型进行转换。整数与浮点数亦是兼容的,所以可相互转换。

⑵ 转换后的数据类型的表示范围不小于转换前的类型。以“扩大转换”来看可能比较容易理解。Java在进行数值运算时,以尽量不损失精度(正确性)为准则。例如,一个字符型的变量(本质上是2字节大小的整数)和一个整型变量(默认为4个字节大小整数)进行计算,在运算前,不同类型的操作数需要先转化为同一数据类型,然后再实施运算操作。因此需要将字符型的变量转换为整型变量,否则将4字节整型变量转换为2字节的字符型,很有可能导致整型变量的值会溢出,从而导致计算错误。字符与整数是可使用自动类型转换的。

假设参与某种运算有两个不同的操作数(操作数1和操作数2),二者具有不同的数据类型,在运算操作之前,它们需要转换为同一数据类型,其相互转换的规则如下表所示。
在这里插入图片描述
声明两个变量,一个是整型,另一个是浮点型(IntAndFloat.java)。
在这里插入图片描述
在这里插入图片描述
从运行的结果可以看出,当两个数中有一个为浮点数时(代码第10行),其运算的结果会直接转换为浮点数。当表达式中变量的类型不同时,Java会自动把较小的表示范围转换成较大的表示范围后,再做运算。也就是说,假设有一个整数和双精度浮点数作运算,Java会把整数转换成双精度浮点数后再做运算,运算结果也会变成双精度浮点数。

现在,我们可以给出自动数据类型转型的规律:byte short int long floatdouble,按照范围由小到大实现自动转型操作。

强制类型转换

当程序需要转换数据类型时,可实施强制性的类型转换,其语法如下。
在这里插入图片描述
自动转换和强制转换的使用方法(AutoConvert.java)
在这里插入图片描述
在这里插入图片描述
当两个整数相除时,小数点以后的数字会被截断,使得运算的结果保持为整数。但由于这并不是预期的计算结果,而想要得到运算的结果为浮点数,就必须将两个整数中的一个(或是两个)强制转换为浮点数,下面的3种写法都正确。
在这里插入图片描述
只要在变量前面加上欲转换的数据类型,运行时就会自动将此行语句里的变量做类型转换的处理,但这并不影响原先所定义的数据类型。

此外,若将一个超出该变量可表示范围的值赋给这个变量,这种转换称为缩小转换。由于在转换的过程中可能会丢失数据的精确度,因此Java并不会“自动”做这些类型的转换,此时就必须要做强制性的转换,例如 int x = (int)10.35(结果x=10),将double类型的值(10.35)强制转换为int类型(10),这样也丢失了很多的信息。

基本数据类型的默认值

在Java中,若在变量的声明时没有赋初值,则会给该变量赋默认值。下表列出了各种类型的默认值。
在这里插入图片描述
在某些情形下,Java会给予这些没有赋初始值的变量一个确切的默认值,这个值没有任何意义,但保证程序执行时,不运行有这种没有初始化值的变量存在。虽然这种方式给程序编写者带来了很多便利,但是过于依赖系统给变量赋初值,就不容易检测到是否已经给予变量应有的值了,这是个需要注意的问题。

1. 整型数的除法要注意

由于整数与整数运算,其结果还是整数,除法也不例外,而很多初学者受到数学上的惯性思维影响,没有能充分注意,导致在一些考试题(面试题)中失利,请参见下面的例程,写出程序的输出结果:
在这里插入图片描述
分析:由于x和y均是整数,在数据类型上,int型 / int型 = int型,所以x /y=10/3=3,而不是[插图]。本题的输出为3,即3.3333的整数部分。

2. C/C++语言和Java语言在布尔类型上存在显著差别

从C/C++语言过渡来学习Java的读者,请注意Java语言与C/C++在布尔类型上有很大区别,C/C++遵循的规则是 “非零即为真”,即所有不是零的数,都可认为是“true”,而仅把0当作false。

而Java语言的布尔类型变量,其赋值只能是true(真)和false(假)两种。除此之外,没有其他的值可以赋值给布尔变量。也不能用1和0分别代替true(真)和false(假)。一言蔽之,Java语言中的布尔类型与整型无关。

Java—最重要的编程部件—运算符、表达式与语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值