坚持是一件说起来容易,做起来不容易的事情。

1 基本数据类型
现实生活中有许多不同的数据类型,比如重量为3.5(小数)千克、学生人数共19(整数)人等。不同的数据类型在内存中占据的空间大小是不一样的,因此在程序开发过程中,在声明变量时必须指明它能存储信息的类型。
由于基本数据类型是构造语言的基础要素,所以学习Java语言中的各种基本数据类型。
1.1 原始数据类型和构造数据类型
数据是程序处理、加工的对象,因此衡量一个程序设计语言的功能是否强大的标准之一就是它包含的数据类型有多少。
Java的数据类型很多,大体上可以分为原始数据类型(也就是#基本数据类型)和#构造数据类型。
这两种数据类型又包含若干子类型,具体如图所示。

Java中数据类型分类
下面将分别对四种原始数据类型进行详细讲解和说明。
1.2 整数型
在Java语法中,被声明成整数型的变量或常量只能用来存放整数。例如,在某个程序中开发人员需要定义一个用来保存员工人数的变量。
根据常识可知,员工的人数肯定是一个整数,所以在定义这类变量时,要将其声明为整数型。在Java中,整数型共有四种,如下表所示。
表 Java中的整数类型

这些数据类型既能存储正数,也能存储负数,但系统分配给不同类型的空间大小不一样,因此不同类型的数据所能保存的数值的大小是有限制的,不能超出它们的取值范围。正如在上一节中讲到的,在程序中声明一个变量或常量时,必须同时指明其数据类型,以确定这个变量或常量可以保存值的范围。例如:
publicclass ChangLiangpublic static voId main(String[]args){//声明一个字节型变量,并赋予初值37byte teacherAge =37;//错误,超出了byte型变量的取值范围teacherAge = 129;System.outprintln("teacherAge="+teacherAge);}}
由于变量teacherAge被声明为byte型的,它在内存空间中只被分配1个字节大小,而这1个字节所能容纳的数值范围是-128~127,因此为变量teacherAge赋值37是被允许的,但如果为它赋值129,那就超出了它所能容纳数值的范围,所以在编译时程序会提示错误信息。
整数型的默认数据类型是int,所以在为long型常量或变量赋值时,需要在所赋值的后面加上一个大写字母“L”(小写字母“1”亦可,但“!”和数字“1”比较像,容易混淆,因此一般用大写“L”)来表示所赋的值为long型。如果所赋的值未超出int型的取值范围,那么省略字母“L”(或“1”)也是可以的。例如:以下几种赋值方式都是正确的。
//所赋的值超出了int型的取值范围,必须在后面加上字母“L”long num=3456789101L;// 所赋的值未超出 int 型的取值范围,也可以在后面加上字母“L”long num=34567891L;//所赋的值未超出int 型的取值范围,也可以省略字母“L”long num=34567891;
下面的这种赋值方式是错误的。
//所赋的值超出了int型的取值范围,同时又没有在后面加上字母“L”longnum=3456789101;
1.3 浮点型
浮点型主要用来存储小数。浮点型可以细分为float型(单精度浮点型)和double型(双精度浮点型)两种,如下表所示。

如果要声明一个用来保存小数的变量或常量,必须将其声明为浮点型。例如:
float fudian = 345.67F;//声明一个float 类型的变量,并赋值double num = 3456.7; //声明一个 double 类型的变量,并赋值double num =3456.7D;
浮点型的默认数据类型是double型,所以在上述示例中,如果在为float型的变量赋值时没有加上字母“F”或“f”,那程序在编译时会提示错误。
在陴犏裁double型的变量或常量赋值时,可以选择在所赋值的后面加上字母“D’或“d”,也可以省略不加。
float fudian = 345;//声明一个float类型的变量,并赋予其整数值double num= 3456; //声明一个double类型的变量,并赋予其整数值
1.4 字符型
在实际开发中,编程人员还经常需要保存各种类型的字母、数字符号、标点符号和其他符号,如J、π、%等,这时就需要用到另一种数据类型--字符型。字符型常用来存储单个字符,编译器会在内存中为它分配2个字节的空间。字符型常量或变量的声明是使用关键字char来完成的。例如:
char dog='狗'; //声明一个char类型的变量,用来存储动物种类char symbol 1 = '$'; //声明一个char类型的变量,用来存储符号S
前面说过,#计算机只能识别二进制数据,所以Java需将不同的字符映射到不同的整数数字,再转换成二进制的形式,才能使计算机识别字符。#这种映射和转换的过程就是字符编码。
计算机刚在美国发明使用时,需要编码的字符不多,基本只是一些字母、数字和简单的标点符号等,因此当时采用的是单字节编码。
当时的人把所需的字符映射到128个二进制数上,形成了所谓的基础ASCI编码。
后来,随着计算机被越来越多的人使用,不同国家和地区的人开发了不同种类的编码系统,以适应各自的需求如我国就有《信息交换用汉字编码字符集》等。
#这样一来就可能造成同一个一进制数对应不同字符或同一个字符由不同二进制数表示、#计算机之间无法相互解码等问题,于是国际标准化组织制定了 Unicode(统一字符编码)标准。这套标准由Unicode字符集和相应的编码规范组成,涵盖了所有国家和地区设置的所有字符并统一为每个字符指定了唯一的二进制编码。
最开始,Unicod编码以2个字节(16位)代表一个字符,这种方式一共可以表示65536个字符。不过,想表示全世界所有语言中的所有字符,这个数量还是不够的,所以Unicode4.0规范又定义了一组附加字符编码。
这套附加字符编码采用2个16位来表示一个字符,一共可以定义1048576个附加字符。
具体的使用方法。#当为一个字符型常量或变量赋值时,#所赋的值必须是使用英文单引号括起来的一个英文字母、#一个符号或一个汉字。例如“狗”“'”等。
另外,有些字符不能通过键盘输入程序,比如#回车符、#换行符等,想要输入这类字符,就要用到转义字符常量。如表所示。
转义字符是一个整体,虽然“反斜杠(\)+1个字符”看起来有2个字符,但它们代表的是1个字符,要一起用英文单引号括起来。如下面的代码所示。
public classCharConstantTest{public static void main(String[] args) {// 声明一个 char 类型的常量,用来存储转义字符“\n”,代表换行fnal char SYMBOL l ="\n';//输出连接转义字符的字符串System.out.println(" 你"+SYMBOL 1+" 好"+SYMBOL 1+" 啊");}}
以上代码的意思是:定义一个char类型的常量SYMBOL 1,并赋予一个转义字符值“\”,然后输出一行信息。
程序运行结果为:
你好啊
1.5 逻辑型(布尔型)
在Java语法中,可以通过声明逻辑型的常量或变量来保存逻辑值tue(真)或Galse(假)。通常,我们将逻辑型称为布尔型,并通过关键字boolean来进行声明。例如
yesOrNo = false; //声明一个boolean类型的变量,初始值为falseyesOrNo = true; //改变yesOrNo变量的值为rue
#逻辑型数据只有true和alse两个值,#无法赋予除true和alse之外的其他值。
1.6 不同数据类型间的转换
在实际开发中,如果需要把某种类型的数据转换为另一种类型的数据,或者需要将不同类型的数据混合运算时,就需要对这些数据类型进行转换。例如:
System.out.println(1.2+3+'a'); //输出表达式"1.2+3+'a'"的值如想知道上述代码中表达式“1.2+3+a”的值,就需掌握不同数据类型之间转换的规则。在Java中,不同数据类型之间的转换分为自动类型转换和强制类型转换两种。
1.6.1 自动类型转换
在Java语法中,相对取值范围较小的数据类型被称为低级数据类型,相对取值范围较大的数据类型被称为高级数据类型。
如想把低级数据类型的数据赋值给高级数据类型的变量或常量,Java可自动完成数据类型的转换。#数据类型的级别与取值范围从低到高的排列顺序,如下图所示。

图中列出了数据类型的大小关系,只要看箭头的指向就可以知道一个数搦类型是否可以自动隐式转换为另一种类型。例如:
floatprice = 36; //定义float类型的变量,并赋值System outprintln("price-"price);//输出price变量的值:price=36.0
从上述示例可以看出,由于整数36的int类型相对于fioat类型来说是低级数据类型,因此程序在运行时会自动将其转换成float类型的36.0,然后再赋值给float变量price。
#即将低级类型的数据赋值给高级类型的变量时,#Java会自动将低级类型转换成高级类型,#然后进行赋值。
有时,需将不同类型的数据进行混合运算,这分为以下两种情况。
(1)只有byte类型、short类型或 char 类型的数据参与混合运算。
在这类运算中,Java会先把byte类型、shont类型或char 类型的数据转换为int类型的数据,然后再进行运算,因此运算结果将会是int型的。
例如:
public class HybridOperationTest1 {publicstaticvoidmain(Stringl] args){//声明一个byte类型的字节变量byte val1-12;//声明一个shor 类型的整型变量short val2-345://声明一-个char类型的字符变量char val3'a';//不同数据类型变量进行混合运算int va4=vall+val2 + val3//输出val4的值:val4=454System.out.println("val4 = " + val4 );}}
在上面的例子中,Java分别把变量val1、val2和val3转换成了int型,然后把它们相加,运算结果是int型变量val4。
(2)有int类型、long类型、float类型或double类型的数据参与混合运算。
在这类运算中,Java会先把相对低级的数据类型转换成表达式中等级最高的数据类型,然后再进行运算,因此运算结果将会是表达式中等级最高的数据类型。例如
public class HybridOperationTest2 {publicstaticvoidmain(String[] args){//声明一个 byte 类型的变量byte vall=12;//声明一个it类型的变量int val2=345;//声明一个float类型的变量float val3=67.8F;不同数据类型变量进行混合运算douhle yal4=val + val2 + val3;//输出val4的值:val4-424.8System.out.println("val4="+val4);}}
在这个例子中,最高级的数据类型是val4的数据类型,也就是double型,所以val1、val2和val3在进行加法运算时,都会先转换成double型,然后再进行加法运算,最终的结果是double型变量va14。
1.6.2 强制类型转换
有时,#还需要把高级数据类型的数据赋值给低级数据类型的变量,此时J#ava不会自动转换,而#必须进行强制类型转换。
例如:
int num = 34.5:; //定义imnt 类型的变量,幷值 double 类型的 34.5System.out.println("num="+num);
将上述代码进行编译时,程序会因为将高级类型的数据34.5赋值给了低级类型的变量num而报错。因此需要改为下面这种形式。
int num=(int)(34.5); //强制类型转换System.out,println("num="+num); //输出num变量的值:num=34.5
在上述示例中,“(int)”表示的是一种将变量强制转换成int类型的语法,是通过在需转换的数据前直接用“(目的数据类型)”的形式将其强制转换成括号内的数据类型的方法。
此外,通过上述示例也可以看出,在把小数进行强制数据转换时程序只做了简单的数据截取,而没有进行四舍五入,所以输出结果是34,而不是35.
在不同类型的变量进行混合运算时,也可以通过强制类型转换让参与运算的变量改变数据类型。
例如:
public HybridOperationTest3{publicstaticvoidmain(String{]args){//声明一个byte类型的变量byte vall=12;//声明一个int类型的变量int val2=345;//声明一个{loat 类型的变量float val3=678.9F;//混合运算,对float_val3 进行强制类型转换val4= vall+ val2 +(int) val3;//输出va14的值:val4 103SSystem.oat.prntla("val4"= + va14)}}
在上面的例子中,把val1、val2和val3 进行混合加法运算,并把运算结果赋给整数类型的val4时,因为vall的数据类型byte型比val2的int型等级低,所以变量val1会自动转换为int型,而val3的数据类型float型比int型的等级高,所以要将其进行强制类型转换,使其转换为int型。
(从基础背景开始学起,坚持,是一件不容易的事情。)

文章推荐
AI基础学习第二阶段笔记:从0开始学Java“搭建Java程序开发环境”
AI基础学习第二阶段笔记:从0开始学Java“开发第一个Java应用程序”
文 | Lisa Notes
Lisa Notes |一个Lisa’s notes:生活、工作、学习中那些事儿,感悟自我成长,随心随笔杂谈。微信搜索「Lisa Notes」(ID:Lisa-notes),查看更多信息,原创小说,PPT干货分享。

长按♥一键关注
特别声明
本文为自媒体、作者等在微信公众号上传并发布,仅代表作者观点,不代表微信公众号的观点或立场,微信公众号仅提供信息发布平台,最终解释权归本人所有。合作请联系13698281600@163.com。
全世界只有不到0.03%的人
关注小SA
你真是个特别的人
快戳我!快戳我!快戳我!㊋㊋㊋