永远相信美好的事情即将发生
文章目录
前言
作为一门标准的强类型语言,Java要求所有的变量需要先声明再使用,变量只能接收数据类型与之匹配的值。
Java一共为开发者提供了8种基本数据类型以及3种引用数据类型,而这8种基本数据类型又可大体分为字符型,整数型,浮点型以及布尔类型,今天我们就对这8种基本数据类型进行一次简单的总结。
基础知识
1. 什么是强类型语言
强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。
上面这段话是百科中对于强类型的定义,强类型语言对于数据类型有着很严格的要求。
打个简单的比方,强类型语言就好比电脑上的各种接口,网线只能插在网线接口,电源线只能插在电源接口上,不能混淆使用。
而在Java语言中,则体现为变量能存储什么类型的数据取决于其定义时的数据类型,例如 int 类型变量只能存放数值数据,String 类型变量只能存储文本数据。
这里需要提一下 Java10 引入的 var 关键字,它允许用户在定义变量时使用 var 而不需要写明变量类型,这看似违背了强类型语言的特性,但其实只是为了简化书写,在程序编译时还是会根据等号右边的内容自动将 var 转换为对应的数据类型。
2. 什么是bit,什么是byte
bit:中文名为比特,是英文Binary digit(二进制数位)的缩写,亦称 位 ,是表示信息的最小单位。众所周知,计算机底层都是基于二进制数实现,1 bit 即代表二进制数中的1位,例如:0001的长度就是 4bit;
byte:中文名为字节,是用于计量存储容量的计量单位,同时也是 Java 的一种基本数据类型。1字节能存储8个二进制位,即 1 byte(字节) = 8 bit(位)。
这里以二进制数 00000001 为例:
3. 数据类型的区间范围计算方法
这个问题只适用于基本数据类型中的数值型。关于数据类型所能表示的区间范围计算方法有很多,这里我们采用一种比较取巧的方法。
这里我们以 byte 类型为例。首先我们知道,1 byte 占8位,即由8个二进制数组成,在这8位中,最高位表示正负,排除出去。而二进制中只有 0 和 1 两种状态,那么这7个二进制数总共会有多少种情况呢?
答案是 2 ^ 7 种 ,那么 byte 类型所能表达的最大的数就是 2 ^ 7,能表达的最小的数就是 -2 ^ 7。又因为是从 0 开始,所以 byte 类型的区间范围为:-2 ^ 7 ~ (2 ^ 7)-1,即 -128 ~ 127。
类型分类
1. 字符型
char 类型,用于存储单独的字符数据,使用时用 ’ ’ 表示,例如:char a = ‘我’;
char 类型存储时占 2 个字节,即 16 位,日常工作中使用较少。
2. 数值型
2.1 整数型
byte 类型,用于存储特别小的数字,占 1 个字节(8 位),范围区间:-2^7 ~ 2^7-1(-128 ~ 127),日常使用较少;
short类型,用于存储偏小的数字,占 2 个字节(16 位),范围区间:-2^15 ~ 2^15-1(-32768 ~ 32767),日常使用较少;
int类型,整数存储使用最多的数据类型,占 4 个字节(32 位),范围区间:-2^31 ~ 2^31-1(-2147483648 ~ 2147483647,可简单记为 ±21 亿);;
long类型,用于存储特别大的数字(数值超过 int 类型存储极限的), 占8 个字节(64 位),范围区间:-2^63 ~ 2^63-1(-9223372036854775808 ~ 9223372036854775807)。声明变量时需要在数据后面加上字母 L,否则会抛类型转换异常。日常使用较少;
2.2 浮点型
float类型,单精度数据类型,存储一般的小数数据,占 4 个字节(32 位)。声明变量时需要在数值后面加上字母 F;
double类型,双精度数据类型,存储一般的小数数据,精度较 float 类型更高,占 8 个字节(64位);
3. 布尔型
boolean类型,值只有 true和 false 两种,常用于各种逻辑判断,非对即错;
4. 汇总
数据类型 | 占用字节数 | 占用位数 | 数据范围 |
---|---|---|---|
byte | 1 | 8 | (-2^7) ~ (2^7-1),-128 ~ 127 |
short | 2 | 16 | (-2^15) ~ (2^15-1),-32768 ~ 32767 |
int | 4 | 32 | (-2^31) ~ (2^31-1),±21亿 |
long | 8 | 64 | (-2^63) ~ (2^63-1) |
类型转换
Java中的类型转换可分为两种:隐式转换和强制转换
1. 隐式转换
在数值型数据中,如果变量a与变量b的数据类型不同,且a的数据类型范围小于b,则变量a的值可以直接赋给变量b,例如:
short a = 5;
int b = a;
隐式转换又称为自动转换,转换过程中没有数据精度的丢失。
2. 强制转换
与隐式转换相反,当我们需要将数据类型范围较大的数据转换为较小的数据类型时,就需要使用强制类型转换。
强制类型转化的格式为:类型a 变量1 = (类型a) 变量2。因为需要转换的数据可能在强制转换类型的数据范围之外,所以强制类型转换存在精度丢失的可能,例如:
public class HelloWorld {
public static void main(String []args) {
int a = 12580;
byte b = (byte)a;
System.out.print("b的值为:"+b);
}
}
输出的结果为:
3. 自动提升类型
自动提升类型这一情况主要存在于不同数据类型数据进行求和运算中,例如,short 类型数据加上 int 类型数据,结果会自动提升为 int 类型,如果直接使用 short 类型的变量去接收就会类型转换异常,这里需要注意。
以下是自动提升类型的规律:
- float 类型数据和任意类型数据相加,结果均为 float 类型
- double 类型数据和任意类型数据相加,结果均为 double 类型
- long 类型数据和任意类型数据相加,结果均为 long 类型
- 除此之外,所有的数值型数据相加,结果均为 int 类型
包装类
作为一门标准的面向对象语言, Java 严格遵守 “万物皆对象” 这一原则。在这个前提下,基本数据类型就变得很尴尬,它们没有属性,也没有方法,显得格格不入。
为了解决这个问题,包装类便横空出世。每种基本数据类型都有一个与之匹配的包装类,他们有自己特有的方法,默认值也和各种对象一样为Null,从而实现 “万物皆对象” 这一基本原则;
1. 对应关系
基本数据类型 | 默认值 | 对应包装类 |
---|---|---|
byte | 0 | Byte |
short | 0 | Short |
int | 0 | Integer |
long | 0L | Long |
float | 0.0f | Float |
double | 0.0d | Double |
char | Null | Character |
boolean | False | Boolean |
从图中可以看出,除了 int 类型和 char 类型外,所有的包装类名均为其所对应的基本数据类型首字母大写。
2. 装箱与拆箱
装箱: 将基本数据类型转换为包装类的操作,无需手动调用方法,自动执行;
拆箱: 将包装类转换为基本数据类型的操作,无需手动调用方法,自动执行;
举例如下:
public static void main(String[] args) {
// 自动装箱
int a = 3;
Integer b = a;
System.out.println("b的值为:"+ b);
// 自动拆箱
Integer c = 5;
int d = c;
System.out.println("d的值为:"+ d);
}
总结
作为 Java 学习的第一站,基本数据类型是所有初学者避不开的一个坎。当然,相对于后面的知识点来说,这一章也没有多少概念和难以理解的内容,对新手还是比较友好的。本篇只是粗略的梳理了一遍,基本数据类型的知识点也远不止此,如果有感兴趣的也可以深挖,与诸君共勉!