初喝咖啡 - java的数据类型及其用法
首先,我们先来了解一下什么是常量。
常量,常量,顾名思义便是不变的量,我们请看以下代码:>
public class BlogData {
public static void main(String[] args){
System.out.println(3.14);
System.out.println('a');
System.out.println("你好");
System.out.println(true);
System.out.println(520)
}
}
其中的3.14, 字符’a’, “你好"等都是常量,我们称其为字面常量,程序运行的结果为
实际上,这里的3.14我们称其为浮点数常量,字符‘a“为字符常量,”你好“为字符串型常量,这就引出了我们的数据类型。
java的数据类型有以下几种:
一.基本数据类型:
1.char字符型、2.boolean布尔型、3.short短整型 、4.int整型、 5.float单精度浮点数、6.double双精度浮点数、 7.byte字节型、8.long长整型
二.引用数据类型
1.类、2.接口、3.数组
接下来我们对其用法及细节进行总结。
byte
字节型数据类型在内存中只占用一个字节,用byte创建的变量在内存中只占8个bit位,又在java中,最高位表示符号位(最高位为1表示负数,最高位为0表示负数)
因此 byte所表示的数据范围
正数 00000000 ~ 01111111 (补码的形式) 即是 0 ~ 127.
负数所表示的范围为
10000000 ~ 11111111(原码的形式)
而11111111(原码)表示为 -127
而10000000(原码)表示为-0,而-0并没有意义,因此规定,10000000 为 2的-7次方, 即-128. 因此 byte的数据类型为-128 ~ 127
因此,我们在定义byte类型的变量时,数据不能超过这个范围,否则就要自己进行强制类型转换。
如:
若我们对byte b = 128 改为 byte b = (byte) 128,所得到的结果会是什么呢?
这里所得到的-128,实际上是这样子得到的。
即byte b = (byte)128, 即127 + 1,所得到的值便是-128了,前提是要进行强制类型转换。
整型家族
1.short类型
short类型在java中占两个字节,其存放数字所允许的范围为-2^15 ~ 2 ^ 15 - 1, 我们来看其基本使用:>
此外,也要注意的是使用short类型时,不能超过其范围,例如:>
编译器会直接报错,平常使用时要注意这一点。
2.int类型
int类型在java中占内存4个字节,其存放数字所允许的范围为 -2^31 ~ 2 ^ 31 - 1 这个范围可以说是相当大了,也是我们在使用整型时最常使用的一种数据类型,其基本使用方式也与上述short类型相似。
刚刚报错的代码,如果我们把数据类型换成int类型,就不会报错了。
3.long类型
long类型在java中占内存8个字节,可以存放的数据进一步扩大,int类型所存放不下的东西它也可以存放。其数据范围为: -2 ^ 63 ~ 2^ 63-1.其基本使用方式也和int类型是一样的:
这便是其最基本的使用方式了,即用long类型创建一个变量b。
4.char类型
char类型在java中占内存2个字节,是的,2个字节,这一点和c语言明显不同,所占内存空间的提升,也意味着其所存放的数据变大,在java中,字符在内存中是以unicode形式编码的。这点特殊性也意味着char类型的范围与别人不同,在java中,char类型变量的范围为
0 ~ 2^16 -1 , 那为什么还要将char类型放在整型家族呢? 那是因为我们可以将整型赋值给char类型的变量(前提是在范围内),电脑会将其对应到unicode所对应到的字符。举例:
这里将97赋值给了char类型的a,因为97对应到unicode编码中为字符’a’, 因此,也就输出所对应的字符了。
浮点型变量
在java中,浮点型类型有两种。 一个是float,另一个是我们的double,我们在下文对其介绍。
要注意的是,两种类型都符合IEEE 754 标准。
float
float在java中占内存4个字节,我们来看以下代码来演示一下float类型的使用。
public class Test {
public static void main(String[] ars){
float a = 3.14;
}
}
请问上图代码是否正确??
答案是错误的,因为3.14在java中默认是double类型的数据,而double类型的数据是无法赋值给float的,因此,我们需要在3.14后面家一个f或F,以此来说明其为float类型。
即
double
double类型的变量在java中所占用的内存空间为8个字节,因此其存放的数据比float精度更高,下面我们来看几段代码:>
public class Test {
public static void main(String[] ars){
double a = 2.7;
double b = 8.1 / 3;
if (a > b){
System.out.println("正确的");
} else {
System.out.println("错误的");
}
}
}
这段代码输出的结果为?
这里说明的是,java中浮点数的内存布局遵守IEEE 754 标准, 尝试使用有限的空间来表示可能无限的小数,势必会存在一定的精度误差,因此浮点数是一个近似值,并不是精确值。我们可以将b打印出来看看它的值为多少:>
是一个无限接近2.7的小数,但并没有达到2.7,因此并不会走if语句。
布尔类型
布尔类型是java中专门用来表示条件真假的类型,例如:>
这里的a就是我们所创建的布尔变量,其被我们赋予了true值,但要知道的是,布尔类型也就只有两种取值,一种是true,一种是false,true表示真,false表示假。
此外,boolea类型并不能与int类型相互转换,例如
System.out.println(true + 1)
这句代码是错误的,编译器也会报错。
最后,我们来讲一下java当中的类型转换:
请看以下这几段代码:>
public class Test {
public static void main(String[] args) {
int a = 10;
long b = 100L;
a = b;
b = a;
}
}
这段代码是否正确?
答案是错误的,问题出在于这句代码
其中a是int类型, b是long类型, long类型是无法赋值给a类型(除非强制类型转换), 这是因为精度的问题。
我们来看一下java中自动类型转换的特点:>
从左到右,依次是自动转换的方向,例如:>
此处我们将a的值赋给b,编译器会将a提升为short类型,再将其赋给b;
若将b赋值给a,则是错误的。因为b的精度比a高,自动转换无法进行。
类型提升
此外,不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。 例如:>
此处a为int类型,而b为long类型, a + b 会将其a的类型提升为long类型后进行计算,但其总体仍然为long类型,long类型在此处无法赋值给int类型,因此,编译会出错。
此外,对于比4个字节小的类型,会先提升成4个字节的int类型,再进行计算。例如:>
public class Test {
public static void main(String[] args) {
byte a = 10;
byte b = 20;
byte c = a + b;
}
}
此处a 和 b 为byte类型,但是a + b 会先将a和b都提升成int, 总体的运算结果类型也为int类型,int在此处是无法赋值给c的。
本文完。