[Java Basic] 03 基本类型
8种基本类型
Java语言有8种基本数据类型,分别用于存储数值、字符和布尔类型数据.
8种数据类型中,最常用的有5种,分别为int、long、double、char、boolean.其余的数据类型几乎不用,要求对这5种基本数据类型重点掌握.
整数类型
整数类型用来存数整数数值,即没有小数部分的数值.可以是正数,也可以是负数.整型数据在Java程序中有3种表现形式.分别为十进制、八进制和十六进制.
| 数据类型 | 内存空间(八位等于1字节) | 取值范围 |
| byte | 8位 | -128 ~ 127 |
| short | 16位 | -32767 ~ 32767 |
| int | 32位 | -2147483648 ~ 2147483647 |
| long | 64位 | -9223372036854775808 ~ 0223372036854775807 |
在定义以上4种类型变量时,要注意变量的取值范围,超出变量的取值范围就会出错.声明long类型变量需要在数值后面加上L或者l.
- int类型
int是最常用的整数类型,一个int类型的变量占用4个字节,即32位的内存空间.Int的最大表示范围大约正负21个亿.
1.整数直接量是int类型
所谓整数直接量就是直接写出的整数.
-
int a = 100; //100为直接量
-
整数的直接量的类型默认为int类型,如果直接写出的整数超过了int的表达范围,将会出现编译错误.
-
int d = 10000000000; // 编译错误,Java认为所有直接写出的整数都是int类型.而这个数值超过了int的表达范围.
-
除了通常的十进制数字形式,整数直接量也可以写成16进制的形式(以0X或0x开头)或8进制的形式(以0开头).
-
int a = 100000; // 10进制 int b = 0x186a0; // 16进制 int c = 0303240; // 8进制
-
2.整型数据除法运算中的取整
若对两个整数相除,会舍弃小数的部分(注意:不是四舍五入),结果也是整数.
-
int c = 5/3; System.out.println(c); // c的值为1,取整 int total = 87; int error = 23; int percent = error / total * 100; System.out.println(percent+"%"); //结果为0%,23除以87整数部分为0,乘以100,为0 percent = 100 * error / total; System.out.println(percent + "%"); // 结果为26%,230除以87整数部分为26
-
3.运算时要防止溢出的发生
当两个整数进行运算时,其结果可能会超过整数的范围而发生溢出,正数过大而产生的溢出,结果为负数;负数过大而产生的溢出,结果为正数.
-
int a = 2147483647; //int类型整数的上限 int b = -2147483648; //int类型整数的下限 a = a + 1; b = b - 1; System.out.println("a=" + a); //输出结果: a=-2147483648 溢出,结果错误. System.out.println("b=" + b); //输出结果: b=2147483647 溢出,结果错误.
-
- long类型
1.使用long类型进行较大整数的运算
对于较大的整数运算(超过int的表达范围),可以使用long型.
-
long distance1 = 10000 * 365 * 24 * 60 * 60 * 299792458l; //必须有一个long型数据参与的运算结果才是long型 System.out.println("distance1="+distance1); //distance1=547836957965889536 结果正确 long distance2 = 10000 * 365 * 24 * 60 * 60 * 299792458; System.out.println("distance2="+ distance2); //distance2=-1973211136 溢出,=号后面的数据默认为int类型,超出了范围,发生溢出.
浮点数类型
浮点类型表示有小数部分的数字.Java语言中浮点类型分为单精度浮点类型(float)和双精度浮点类型(double).
| 数据类型 | 内存空间(8位等于1字节) | 取值范围 |
| float | 32位 | 1.4E-45 ~ 3.4028235E38 |
| double | 64位 | 4.9E-324 ~ 1.7976931348623157E308 |
- double类型
1.使用double进行浮点数的运算
double类型的精度值是float类型的两倍,因此而得名双精精,在实际的应用开发中,float应用极少,大多数场合使用double表示浮点数.
-
double pi = 3.14; double r = 8; double s = pi * r * r; System.out.println("s=" + s); // 输出的结果为:s=200.96
-
2.double运算时会出现舍入误差
2进制系统中无法精确的表示1/10,就好像十进制系统中无法精确的表示1/3一样,所以,2进制表示10进制会有一些舍入误差,对于一些要求精确运算的场合会导致代码的缺陷.
-
double money = 3.0; double price = 2.9; System.out.println(money - price); //输出的结果是: 0.10000000000000009
-
字符类型
- char类型
字符类型char事实上是一个16位无符号整数(都是正数),这个值是对应字符的编码,Java字符类型采用Unicode字符集编码(通用码、统一码、 万国码).
而Unicode是世界通用的定长字符集,所有的字符都是16位来表示.例如:字符a实际的值为97,字符A实际的值为65,字符0实际的值为48.
-
char c1 = ‘中’; //c1中存的是”中”的编码 char c2 = '\u4e2d'; //‘4e2d’为‘中’所对应的16位Unicode编码的16进制表示形式 System.out.println(c1); System.out.println(c2);
-
1.对char型变量赋值
方式一:字符直接量:形如‘A’,变量中实际存储的是该字符的Unicode编码(无符号整数值),一个char型变量只能存储一个字符.
-
char c1 = 'A';
-
方式二:整型直接量:范围在0~65535之间的整数,变量中实际存储的即该整数值,但表示的是该整数值所对应的Unicode字符.
-
char c2 = 65;
-
Unicode形式:
-
char c3 = '\u0041';
-
2.使用转义字符
转义字符是一种特殊的字符变量,它以反斜线"\"开头,后跟一个或多个字符.转义字符具有特定的含义,不同于字符原有的意义,故称为"转义".
| 转义字符 | 含义 |
| \ddd | 1-3位八进制数据所表示的字符 |
| \dxxxx | 4位十六进制所表示的字符 |
| \' | 单引号字符串 |
| \\ | 反斜杠字符 |
| \t | 垂直制表符 |
| \r | 回车 |
| \n | 换行 |
| \b | 退格 |
| \f | 换页 |
布尔类型
boolean类型适用于关系、逻辑运算,表示某个条件是否成立,只允许取值true或false,true表示条件成立,而false表示条件不成立.
boolean型变量经常用于存储关系运算的结果,所谓关系运算就是比较两个变量的大小相等等关系.
-
int age = 18; boolean isChild = age<16; System.out.println(isChild); // isChild的值为false boolean running = true; boolean closed = false;
基本类型之间的转换
不同的基本类型直接可以相互转化,转为方式分为两种:隐式类型转换和显式类型转换.
- 隐式类型转换
从低级类型向高级类型的转换,系统将会自动执行.程序员无需进行任何操作.这种类型的转换称为隐式转换.

1.数值运算时的自动转换
如果在一个表达式中出现了多种数据类型,则运算结果会自动的向较大的类型进行转化.
-
//由于有long型的直接量参与,整个表达式的结果为long long distance = 10000 * 365 * 24 * 60 * 60 * 299792458l; //由于有double型的直接量599.0参与,整个表达式的结果为 double double change = 800 - 599.0; //结果为0.0,右边都是int型数据运算结果也为int类型,结果为0,再赋值给double 型,将0转化为 0.0 double persent1 = 80 / 100; //结果为0.8,右边表达式有double型直接量参与, 运算结果为double型 double persent2 = 80.0 / 100;
-
2.byte、char、short转换为int
8种数据类型中,byte、char、short、int、long都表示整数类型,而整型的直接量为int.
int直接量可以直接赋值给byte、char和short,只要不超过其表示范围.
-
byte b = 97; short s = 97; char c = 97;
-
byte、char、short三种类型参与运算时,先一律转换成int类型再进行运算.
-
byte b = 97; int num = b + b; //num的值为194
-
- 显式类型转换
当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转换运算(又称强制类型转换).
语法: (类型名)要转换的值
-
int a = (int)45.23; //此时输出a的值为45 long y = (long)456.6F //此时输出y的值为456 int b = (int)'d'; //此时输出b的值为100
-
强制转换时的精度丧失和溢出.
-
int a = 100; int b = 200; long c = a + b; //自动将int转化为long long l1 = 1024l; int i = (int) l1; //需要加强制转化符由于1024在int的范围内,所以没有产生溢出 long l = 1024L * 1024 * 1024 * 4; int j = (int) l; //会产生溢出 System.out.println(j); // 结果为:0 double pi = 3.1415926535897932384; float f = (float) pi; //会造成精度的损失,因为单精度的精确度小于double System.out.println(f); //结果为:3.1415927
-
当执行显式类型转换时可以能会导致精度损失.所以进行强制类型转换时要避免.


浙公网安备 33010602011771号