java语言中也和C语言一样会有数据类型,在Java中数据类型主要分为两类:基本数据类型和引用数据类型。
我们在此先介绍基本数据类型,基本数据类型分为8种:
数据类型 | 关键字 | 内存占用 | 范围 |
---|---|---|---|
字节型 | byte | 1 字节 | -128 ~ 127 |
短整型 | short | 2 字节 | -32768 ~ 32767 |
整型 | int | 4 字节 | -231 ~ 231 -1 |
长整型 | long | 8 字节 | -263 ~ 263 -1 |
单精度浮点型 | float | 4 字节 | 有范围,一般不关注 |
双精度浮点型 | double | 8 字节 | 有范围,一般不关注 |
字符型 | char | 2 字节 | 0 ~ 65535 |
布尔型 | boolean | 没有明确规定 | true 和 false |
在Java种也有像C语言有变量和常量,常量就是包含了上述数据类型的字面常量,还有字符串常量和空常量,常量是不能可变的量。变量是可变的量,也可以认为是申请一块空间把字面常量放到这个空间中去,这个空间放的字面常量可以替换为其他类型相同的字面常量。Java是一种强数据类型语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。
整型变量分为byte类型 int类型 short类型 long类型
int a;
System.out.println(a);
用编译器会报错:java: 可能尚未初始化变量a
Java对于是否初始化要求很高,C语言未初始化只会系统赋值为随机值,而Java未初始化编译器会报错,程序进行不下去。所以Java在定义的时候要初始化,如果没有合适的初始值,可以设置为0。
int a = 2147483648;
System.out.println(a);
int 类型的变量取值范围是-231 ~ 231 -1,超过这个范围的整型数据不会存储到变量值,这个也是和C语言不同的地方C语言的话就会直接存储到变量中去。
查看int类型变量的最大最小值需要用到包装类,int类型的包装类是Integer。基本数据类型的包装类只有int类型和char类型(Character)的包装类特殊,其他基本数据类型的包装类是该数据类型首字母大写,比如short的包装类未Short。
int a = 0;
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
输出结果为:
2147483647
-2147483648
整型数据类型大多数情况下用的是int类型,存储数据较大用long类型,较小用byte或者short类型
求byte,short,long类型变量的大小
short sh = 0;
System.out.println(Short.MAX_VALUE);
System.out.println(Short.MIN_VALUE);
byte b = 0;
System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);
long a = 0L;//L代表该数字是长整型,写不写都可以但是建议写上
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
输出结果为
32767
-32768
127
-128
9223372036854775807
-9223372036854775808
整型变量只会进行整数间的运算,变量间运算结果也是整型数据。想要得到小数我们就需要浮点型变量来处理。
float f = 12.5;
System.out.println(f);
程序报错:java: 不兼容的类型: 从double转换到float可能会有损失
12.5这样的小数默认为double,想要给float类型赋值写为12.5f或者12.5F
double d = 3.0/2.0;
System.out.println(d);
float f = 12.5f;
System.out.println(f);
输出结果为:
1.5
12.5
Java中的字符型变量是占据两个字节的,字符类型变量可以直接赋值为汉字或者其他符号,因为C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符。Java中用 单引号 + 单个字母表示字符。
char ch = '哈';
System.out.println(ch);
输出结果为 哈
但是在执行 javac 的时候可能出现以下错误:
此时我们在执行 javac 时加上 -encoding UTF-8 选项即可
布尔型变量(boolean)代表真假,与C语言的0为假非0为真不同,Java表示真假只有两种取值, true 表示真, false 表示假。
在Java语言中布尔类型不能够转化为其它类型不同于C语言的0表示真非0表示假
Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机实现中,boolean占1个字节。
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。
特点:数据范围大的到数据范围小的。
整型家族中长整型范围大于整型,整型大于短整型,短整型大于字节型。浮点型是大于整型家族的,在浮点型内部,双精度浮点型大于单精度浮点型。
public static void main(String[] args) {
byte b = 20;
short s = b;
//b = s//err
int a = 10;
long l = a;
//a = l;//err
float f = l;
double d = f;
//f = d;//err
}
在隐式类型转化中,只能由范围小的转化为范围大的,但是范围大的能不能转化为范围小的呢?
答案是可以的,这种转换称为强制类型转换。
强制类型转换由()操作符来实现。
public static void main(String[] args) {
float f = 2.5f;
int a = (int)f;
System.out.println(a);
}
输出结果为:2
如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失。
boolean b = false;
int i = (int)b;
程序会报错:
java: 不兼容的类型: boolean无法转换为int
强制类型转换不一定能成功,不相干的类型不能互相转换
和C语言中的类型提升大致相同。不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。但是需要注意的是整型提升部分。由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short这种低于 4 个字节的类型, 会先提升成 int, 再参与计算。
byte a = 1;
byte b = 2;
byte c = a+b;
编译器会报错
java: 不兼容的类型: 从int转换到byte可能会有损失
这是因为范围小于int类型的整型比如short,byte会在运算过程中类型提升到整型,整型赋值为字节型编译器自然会报错,运行不下去。所以要想赋值成功要么强制类型转化,要么c定义为int型。
byte a = 1;
byte b = 2;
byte c = (byte)(a+b);
int d = a+b;
在C语言中有字符串常量,但没有单独的字符串类型来存储字符串,在C语言中存储字符串用字符数组或者用字符指针来存储字符串常量的首地址。Java语言有单独的数据类型来存储,使用String类定义字符串类型。
public static void main(String[] args) {
String s1 = "zhang ";
String s2 = "san";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1+s2);
}
输出结果为
zhang
san
zhang san
s1+s2表示:将s1和s2进行拼接
String类型与整型浮点型之间可以互相转化,浮点型和整型直接通过类型转换到String类型,或者用方法进行转化。
public static void main(String[] args) {
double d = 10.5;
String str = d + "";
System.out.println(str);
long l = 1314;
str = l+"";
System.out.println(str);
int i = 521;
str = String.valueOf(i);
System.out.println(str);
}
输出结果
10.5
1314
521
String类型转化为浮点型或者整型就需要用到方法。
public static void main(String[] args) {
String str = "521";
int num = Integer.parseInt(str);
System.out.println(num);
str = "1314.521";
double d= Double.parseDouble(str);
System.out.println(d);
}
输出结果
521
1314.521