目录
2 数据类型
Java数据类型有两种:基本数据类型和引用数据类型。
2.1 基本数据类型(四类八种)
整型 | byte(占1个字节) | short(占2个字节) | int(占4个字节) | long(占8个字节) |
浮点型 | float(占4个字节) | double(占8个字节) | ||
字符型 | char(占2个字节) | |||
布尔型 | boolean(占1个字节) |
2.1.1 整型
类型名称 | 内存空间 | 取值范围 | |
byte | 字节型 | 1字节 | -2^7 ~ (2^7) -1 |
short | 短整型 | 2字节 | -2^15 ~ (2^15) -1 |
int | 整型 | 4字节 | -2^31 ~ (2^31) -1 |
long | 长整型 | 8字节 | -2^63 ~ (2^63) -1 |
以字节型byte的取值范围为例:byte类型的数据占用一个字节的内存,一个字节等于八个比特(即1 Byte=8 bit),即为一个八位二进制。而计算机中正数的最高位为“0”,负数的最高位为“1”,计算机中的数据使用的是补码,正数的补码=原码,负数的补码=反码+1,反码等于原码除符号位不变其他位全部取反,则byte的取值范围具体如下图:
注意:当八位二进制的-128取补码时,会出现溢出现象,得到结果是错误的,可以假设为16位二进制的-128,-128的原码:1000 0000 0000 0000 0000 0000 1000 0000;-128的补码1111 1111 1111 1111 1111 1111 1000 0000,从右向左截取八位,还是1000 0000,所以得到-128的补码还是-128,即1000 0000。
正数 | 负数 | ||
最小值 | 二进制 | 原码:0000 0000 补码:0000 0000 | 原码:1000 0000 补码:0000 0000(溢出) |
十进制 | 0 | -0(-128) | |
最大值 | 二进制 | 原码:0111 1111 补码:0111 1111 | 原码:1111 1111 补码:1000 0001 |
十进制 | +127 | -1 |
注意:整数字面值在程序中默认为int类型,当定义一个long类型的变量时,可以直接将整数字面值赋给long类型的变量,但如果该数超过了 int 的取值范围(-128~127)时,必须在字面值后面加 L 或 l 后缀,否则编译会报错。
2.1.2 浮点型
类型名称 | 内存空间 | 有效数字位数 | |
float | 单精度浮点型 | 4字节 | 7~8 |
double | 双精度浮点型 | 8字节 | 15~16 |
注意:
① 浮点数字面值默认都是double类型来存储的;
② 给float类型的变量赋值时,需要在浮点数字面值后面加 F 或 f ,否则编译会报错;
③ Java支持科学技术法:
科学计数法表示的数据是浮点型的,默认为double类型的;
数学中3.5* 10^2在Java中用科学计数法表示为3.5e2。
2.1.3 字符型
类型名称 | 内存空间 | 表示形式 | |
char | 字符型 | 2字节 | 必须用单引号括起来,例 ‘a’ |
注意:
① 单引号中可以是单个英文字母、中文汉字、空格、转义字符。
② 字符型数据也可以直接赋予一个整型字面值,但该整型字面值不是任意的数值,而是ASCII码表中存在的数值。
char c = 97 ; //输出a
转义字符:
格式:\字符
例:输出一个单引号:char c = ' \ ' ' ;
输出一个斜杠:char c = ' \\ ' ;
特殊含义的转义字符:\t 表示间隔一段距离,
\r\n表示回车换行(现在 \n 即可表示回车换行)
2.1.4 布尔型
类型名称 | 内存空间 | 输出结果/值 | |
boolean | 布尔型 | 1字节 | true/false |
注意:二进制是最小的单位,其中1表示true,0表示false。但是在Java中以字节作为最基本的操作单位,所以在Java中判断true or false必须用布尔型字面值表示。
2.2 引用数据类型
在Java中,引用数据类型的变量类似于C / C++的指针,引用数据类型指向一个对象,指向对象的变量是引用变量,这些变量在声明时被指定为一个特定的类型。变量一旦声明后,类型就不能被改变了。常见的引用数据类型有:String类型、自定义类、接口、数组等。
注意:
① 所有引用数据类型的默认值都是null;
② 一个引用变量可以用来引用任何与之兼容的类型。
3 字面值
3.1 概念
在程序中无需变量保存,可以直接使用的值称为字面值,又称为直接量。
3.2 分类
3.2.1 数值型字面值
1、整数
包括正整数和负整数
注意:整数默认为十进制,但也可在十进制数加前缀表示以n进制读取该数值。
进制 | 英文名称 | 范围 | 前缀 | 后缀 |
二进制 | Binary | 0-1 | 0B / 0b | B |
八进制 | Octal | 0-7 | 0 | O |
十进制 | Decimal | 0-9 | 无 | D |
十六进制 | Hexadecimal | 0-9,A-F | 0X / 0x | H |
//二进制:0b10表示2
System.out.println(0b10);
//八进制:010表示8
System.out.println(010);
//十六进制:0x10表示16
System.out.println(0x10);
2、浮点数
包括正浮点数、负浮点数和科学计数法所表示的数。
//正浮点数0.22
System.out.println(0.22);
//负浮点数-0.22
System.out.println(-0.22);
//科学计数法表示的100
//100 = 1*10^2(数学中的表示方式)
// = 1.0e2(科学计数法表示方式)
System.out.println(1.0e2);
3.2.2 字符型字面值
用一对单引号引起来的一个字符,字符可以为一个中文汉字、一个英文字母、一个标点符号或一个空格(可以有空格,但不可以什么也不写)。
System.out.println('嗨'); //输出结果:嗨
System.out.println('a'); //输出结果:a
System.out.println(','); //输出结果:,
System.out.println(' '); //输出结果: ————空格
//System.out.println(''); //单引号内什么也不写,编译时会报错
转义字符:
格式:\字符
常用的转义字符:
\' 表示输出一个单引号
\" 表示输出一个双引号
\\ 表示输出一个斜杠
3.2.3 字符串型字面值
用一对双引号引起的0-n个字符
System.out.println("");//输出结果为空,但不报错
System.out.println("a" + "" + "b");//输出结果:ab
System.out.println(" ");//输出结果为一个空格
System.out.println("a" + " " + "b");//输出结果:a b
System.out.println("a");//输出结果:a
System.out.println("Hello World!");//输出结果:Hello World!
3.2.4 布尔型字面值
表示逻辑判断的结果,只有true和false两种值
System.out.println(true);//输出结果:true——这个true表示的是布尔型字面值true
System.out.println("true");//输出结果:true——这个true表示的是字符串"true"
4 数据类型转换
4.1 自动数据类型转换
4.1.1 数值型
以byte—>short—>int—>long—>float—>double的顺序,从小转到大,因为大内存可以容纳小内存,所以可以进行自动数据类型转换。
1、整型(byte—>short—>int—>long)
以byte和int之间的转换为例,代码如下:
//小转大,自动转换
byte b = 5;
int a = b;//byte转int,小转大,可自动转换,可以正常运行
//大转小,编译时报错
int c = 5;
byte d = a;//int转byte,大转小,会出现溢出问题(无论所赋值的大小,只看类型存储的大小),所以编译时会报错
2、浮点型(float—>double)
//小转大,自动转换,正常运行
float f = 1.2f;
System.out.println(f);//1.2
double d = f;//小转大,自动转换,编译不报错,可以正常运行,但是会出现精度损失的问题
System.out.println(d);//1.2000000476837158
//大转小,编译时报错
double d2 = 1.2;
//float f2 = d2;//大转小,编译时报错
3、整型——>浮点型
以int类型转为double类型为例,代码如下:
int i = 5;
double d = i;//可自动转换,可正常运行,默认转换方式:直接在整型后面加点零
System.out.println(d);//输出结果:5.0
以long类型转为float类型为例,代码如下:
long l = 10000000000L;
float f = l;
System.out.println(f);//输出结果:1.0E10
注意:long类型转为float类型得到的结果是用科学计数法存储的。
4.1.2 字符型
以char—>int—>long—>float—>double的顺序,从小转到大,可以进行自动数据类型转换。
1、字符型——>整型
以char类型转int类型为例,代码如下:
char c = 'a';
int i = c;
System.out.println(i);//输出结果:97
注意:char类型数据转int类型,是根据ASCII码表,将指定字符在ACSII码表中对应的值传给int类型的变量
2、字符型——>浮点型
以char类型转float类型为例,代码如下:
char c = 'a';
float f = c;
System.out.println(f);//输出结果:97.0
4.2 强制数据类型转换
1、大转小为什么会报错?
首先,因为不同数据类型所占内存空间不同,大内存转入小内存,数据会丢失(溢出),所以编译时会报错;其次,无论所赋值得大小,编译时都会报错。因为程序在编译时只能检查数据类型,并不能确定变量具体所赋的值,所以编译时会报错。
2、格式:(type)数据 ————将数据转为type数据类型
3、整型之间的强转
(1)如果大类型的值在小类型的范围之内,强转的值不变,以int转byte为例,代码如下:
int i = 5;
byte b = (byte)i;
System.out.println(b);//输出结果:5
(2)如果大类型的值超出了小类型的范围,则强转后的值不是大类型原来的值,但循环一定的规律,以int转byte为例,代码如下:
int i = 128;
byte b = (byte)i;
System.out.println(b);//输出结果:-128
注意:超出小类型范围的强转,会将大类型的值先转为对应的二进制,再根据小类型可以存储的二进制位数从最右边开始截取得到强转后的值,具体如下图所示:
4、浮点型强转整型
舍弃小数部分,只保留整数部分
double d = 3.51d;
int i = (int)d;
System.out.println(i);//输出结果:3
注意:强制数据类型转换要谨慎使用:
基本数据类型强转可能会超出小类型的范围;
引用数据类型强转可能会抛出异常。