【夫子原创】Java基本类型详解

日期:2017-10-19 10:16:28

现实生活中,我们能够接触的到信息有很多种,有文字的,有数字的,有图片的,有声音的,还是视频的,这些信息我们随处可见,可以说我们离不开这些信息。现代的人们离不开计算机,计算机能够帮我们处理很多信息,不管是声音的、文字的还是数字的,它能够轻易快速的处理,计算机之所以能够处理这些信息,是因为它安装了程序的原因,程序能够帮助我们解决实际的问题,所以,程序是可以分辨出这些信息的。我们知道计算机只内部只认识0和1,但是高级程序语言是很符合人类的自然语言,人类是可以看得懂并且可以编写出来的,既然是符合人类自然语言的,就会模拟我们人类现实世界中的各种信息种类。那么,我们就来看下Java语言中,有哪些基础的信息类型。
 

数字:

首先我们看下现实生活中的数字,数字可以分为整数和小数,另外,数字有大小之分,而我们日常所能接触到的数字大多都在亿级以内,如果再分最常用的,可能就在百和千之间了,所以,这么多的数字,我们人类不是都会需要用到,常用的也许就那么一点点范围,就足够我们正常使用的了,我们的Java语言考虑到这个问题,所以就把数字分为整形和浮点型(也就是小数),整形又分为了byte、short、int和long,浮点型分为了float和double。Java把数字分为了6种类型,每个类型都对于一个范围,我们在使用的时候,就可以选择适合自己的范围,这样能够提高系统的效率。下图就是Java基本类型之数字的分类:

 

我们来一个个的分析每个数字类型的大小范围。

1.byte:

大小范围[-128, 127]。

2.short:

大小范围[-32768, 32767]。

3.int:

大小范围[-2的31次方,2的31次方-1]。也就是正负21亿左右

4.long:

大小范围[-2的63次方,2的63次方-1]。数字很大,只可意会。

5.float:

浮点数比较特别,它是由精度的,float大约在[1.4E-45,3.4E38],这是用科学计数法表示的,比如0.05可以表示为5*0.01,用科学计数法表示为:5E-2,如果是500,可以表示为5*100,用科学计数法表示为:5E2。

6.double:

double也是浮点数,和float一样,也是用科学计数法来表示,大小范围在[4.9E-324,1.7E308]。

 

字符型

除了数字,日常生活中我们见到最多的就是字符了,地球上有两百多个国家,每个国家的语言都不尽相同,英语有26个字母,常用的汉子也有三千多个,我们使用计算机能够阅读浏览网页,收发电子邮件,里面充满了各种字符,中文的,英文的,还有各种符号,我们的Java语言也需要处理这些字符,所以,Java就提供了字符型char来表示我们日常使用的字符。

char:

大小范围[0, 65535]

字符型是没有负数的,在Java语言中,字符是按照特定的编码将字符转化成十六进制数字,所以字符和数字之间是可以转换的。

 

布尔型

我们常常判断一个东西的真与假,老师批阅试卷,使用✔️号和❌来表示对和错,计算机也要做这样的逻辑判断,所以Java语言提供了布尔型来表示这样的判断,使用boolean来表示,而且它的值就只有两个,一个是true表示真,一个是false表示假。

 

以上就是Java语言中的基本数据类型,由数字、字符和布尔组成的,其中数字又可以分为整形和浮点型,基本类型的分类如下图:

 

基本类型的使用

变量的定义

上一节我们聊了基本类型在Java语言的分类和定义,这是简单的做了介绍,让大家对基本有个整体的感知,但是,如果只是知道这些基本类型,还不够,还得知道如何去使用这些基本类型,那么下面,我们就来看下基本类型的使用。

想要使用Java提供的基本变量,我们需要知道如何定义一个变量。变量是有变量名和变量类型组成,变量名就是给变量起个名字,可以是字母组成,也可以是字母+数字组成;变量类型可以是Java提供的8个基本类型,举个例子,我们可以定义一个数字类型的变量num,数字类型我们使用int,定义如下:

int num;

这样我们就定义了一个名字叫num,且类型为int的变量。当然我们也可以定义其它类型的变量,如下:

byte a;

shrot c;

long age;

float amount;

char sub;

boolean flag;

上面是我们定义的一些变量,这些变量的类型都是Java的基本类型,变量名可以取任何的名字,最好是由字母组成的,或者是字母+数字,另外,变量名要起的有意义,让人一看就只知道这个变量是代表什么的。

除了定义变量,我们还可以给变量赋值,语法如下:

int a = 1;

boolean flag = false;

赋值我们使用的是“=”号,注意,计算机在执行赋值语句时,是从右向左执行的,所以上面两句代码,第一句代表的意思是将数字1赋值给int类型变量的a,第二句代表的意思是将false赋值给boolean变量flag。

我们在代码中使用变量的时候,要先定义变量,定义完变量后,才能使用变量。另外,我们的基本类型是有初始值的,也就是说,你只要定义一个基本类型的变量,即使没有赋值,它也会有个默认的值,基本类型的默认值,如下表:

byte

short

char

int

long

float

double

boolean

0

0

\u0000

0

0

0.0f

0.0d

false

 

其中,需要大家注意的是,char的默认值是不是很奇怪,这其实是char的一种表现形式,在Java种,char的实质是使用Unicode表示的,所以,只要是字符都可以使用char表示,包括转义字符,如下:

char a = 'A';

char b = 100;

char c = '\u0000';

char d = '\n';

 

以上是char的4中表示方法,第一种很常见,就是一个字符,第二种,我们把一个数字赋值给了char类型变量b,这牵扯到一个类型转换的概念,因为本质上char是一个Unicode编码,所以可以和它表示范围内的数字进行转换。第三种是直接使用Unicode编码表示的,第四种是一个转义字符,转义字符其实就是我们常见的回车换行、制表符等,这在计算机内部也是使用字符表示的。比如制表符我们使用“\t”表示。

 

另外,需要我们注意的是,在Java语言中,小数默认的类型是double类型的,所以,在定义float变量时,需要加上类型转换,如下:

 

float a = 3.14f;

double b = 3.14;

 

如上,我们定义了两个浮点类型的变量,其中,变量a是float类型的,此时,需要将数字3.14后面带上小写的f(大写的也可),这就是告诉Java虚拟机,把3.14当做float类型,因为,小数默认的类型是double,所以,变量b就不用转换了,因为b变量本身就是double类型的。如果我们定义float类型的变量,没有进行转换,编译会报错,如下:

float a = 3.14;  //错误,编译通不过,后面需跟上f或者F转换成float才行。

变量只有定义好之后,才能使用,如下:

System.out.println(number);   //编译报错,number未定义

我们需要先定义number变量才能使用,如下:

int number = 100;

System.out.println(number);

我们先定义了number变量,然后才在打印输出语句中使用变量number。

 

变量之间的转换

因为每个基本类型都是有其范围的,不同类型之间是不可以随意转换的,比如,byte类型它的范围是[-128, 127],所以,要讲一个300的数字赋值给一个byte变量,很定是有问题的,但是把一个100的数字赋值给byte就没有问题,如下:

byte a = 100; //正确

byte b = 300; //编译错误,超出了范围。

byte类型最大值就是127,把一个300的数字赋给byte,byte接收不了,报错。

我们知道int类型的变量能够表示正负21亿之多的范围,比byte大多了,如果我们将int类型的变量赋值给byte,会产生怎样的效果呢?我们看下面的例子:

int a = 500

byte b = a;  //编译错误,把int类型转换为byte类型可能会出现溢出。

 

如上,我们定义了int类型的变量a,赋值为500,又定义了byte类型的变量b,我们将变量a赋值给了变量b,我们知道int表示的范围要比byte大很多,所以,Java编译器会报错,因为,它在试图将一个大类型转换为一个小类型,很可能会出现误差。比如,一个水杯,容量是有限的,一旦超过最大容量,水就会溢出。同样的,把int类型的值赋值给byte类型,是一个危险的操作,即使int的值实际上并没有超过byte,如下:

int a = 100;

byte b = a;  //编译错误,int类型转byte类型会出现溢出。

如上,虽然,int类型的变量a的值并没有超过byte的范围,但是Java编译器依旧会报错,无法将int类型转换为byte,因为这样做是有风险的。当然,也是可以转换的,你得明确的告诉编译器,我就是要转,不转不行。毕竟机器还是得听人类的。我们可以使用强制类型转换,如下:

int a = 100;

byte b = (byte)a;

这样就可以将int类型转换为byte类型了。下面是一个强制转换的例子:

int a = 100;

byte b = (byte)a;

System.out.println(b);  //打印出100

int m = 300;

byte n = (byte)m;

System.out.println(n);   //打印出44

 

如上,在强制类型转换中,如果范围大的变量转换为范围小的变量会出现溢出的现象,一旦溢出,就会有误差,比如上面的将int变量m强制转换为byte类型的变量n,由于,变量m的值为300,已经大于了byte的最大值127了,所以,byte表示不了300,就产生了溢出,导致了误差,所以,变量n打印出来的值是44,和原来的300产生了误差。

在基本类型中,范围由小到大的顺序如下:

byte->short->int->long->float->double

或者

char->int->long->float->double

 

以上是从左到右,范围递增,也就是如果将左边的类型赋值给右边的是没有问题的,安全的,但是反过来,如果把右边的类型赋值给左边的类型,就需要强制转换,这是危险的,可能会出现溢出误差。比如int按照上面的顺序是在byte的右边,所以,将int赋值给byte类型的变量,就得强转,还有可能出现误差。另外,需要大家注意的是,char类型不能和byte、short相互转换,它们是平级的,只能和int转换,这是需要大家的注意的。

 


 

程序员孵化课程表:

 

JDBC编程+MyBatis框架+项目实战 7天 ¥1600

11月17号-11月23号(含周六周日)

(报名中)

JavaEE高级+项目实战+模拟面试 2.5个月 ¥8000

2017.11.24-2018-02-08

(报名中)