【JAVA基础】基本数据类型
Java数据类型简介
Java语言中的数据类型分为两大类,分别是基本类型和引用类型。程序中需要处理许多数据,对于不同数据都有其对应的数据类型,其实就是在内存中开辟一个存储空间来存放数据,不同数据所开辟的内存大小也会不一样。
Java基本数据类型
Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。
数据类型占用内存:
整数型
在Java中,整数类型包括以下几个:
byte 字节型 (8个bit,也就是1个字节)范围:-128~+127
short 短整形(16个bit,也就是2个字节)范围:-32768~+32767
int 整形(32个bit,也就是4个字节)最常用的类型:-2147483648 ~ +2147483647
long 长整形(64个bit,也就是8个字节)范围:-9223372036854775808 ~ +9223372036854775807
public class Main {
public static void main(String[] args) {
byte b =11;
short s =34;
int a =12;
long l = 54;
System.out.println(b);
System.out.println(s);
System.out.println(a);
System.out.println(l);
}
}
运行结果:
我们可以将小的整数类型值传递给大的整数类型,反之则报错:
public static void main(String[] args) {
short a = 10;
int b = a; //小的类型可以直接传递给表示范围更大的类型
System.out.println(b);
}
反之则报错
这是由于我们在将小的整数类型传递给大的整数类型时发生了隐式类型转换,只要是从存储范围小的类型到存储范围大的类型,都支持隐式类型转换,它可以自动将某种类型的值,转换为另一种类型,比如上面就是将short类型的值转换为了int类型的值。
隐式类型转换不仅可以发生在整数之间,也可以是其他基本数据类型之间。
实际上我们在为变量赋一个常量数值时,也发生了隐式类型转换,比如:
public static void main(String[] args) {
byte b = 10; //这里的整数常量10,实际上默认情况下是int类型,但是由于正好在对应类型可以表示的范围内,所以说直接转换为了byte类型的值
}
由于直接编写的整数常量值默认为int,这里需要特别注意一下,比如下面这种情况:
按照long类型的规定,实际上是可以表示这么大的数字的,但是为什么这里报错了呢?这是因为我们直接在代码中写的常量数字,默认情况下就是int类型,这么大肯定是表示不下的,如果需要将其表示为一个long类型的常量数字,那么需要在后面添加大写或是小写的L才可以。
public static void main(String[] args) {
long a = 922337203685477580L; //这样就可以正常编译通过了
}
当然,针对于这种很长的数字,为了提升辨识度,我们可以使用下划线分割每一位:
public static void main(String[] args) {
int a = 1_000_000; //当然这里依然表示的是1000000,没什么区别,但是辨识度会更高
}
我们也可以以8进制或是16进制表示一个常量值:
public static void main(String[] args) {
System.out.println(0xA);
System.out.println(012);
}
十六进制:以0x开头的都是十六进制表示法,十六进制满16进一,但是由于我们的数学只提供了0-9这十个数字,10、11、12...15该如何表示呢,我们使用英文字母A按照顺序开始表示,A表示10、B表示11...F表示15。比如上面的0xA实际上就是我们十进制中的10。
八进制:以0开头的都是八进制表示法,八进制就是满8进一,所以说只能使用0-7这几个数字,比如上面的012实际上就是十进制的10。
此时a的值已经来到了int类型所能表示的最大值了,那么如果此时再继续+1,各位小伙伴觉得会发生什么?可以看到结果很奇怪:
什么情况???怎么正数加1还变成负数了?请各位小伙伴回想一下我们之前讲解的原码、反码和补码。
我们先来看看,当int为最大值时,二进制表示形式为什么:
2147483647 = 01111111 11111111 11111111 11111111(第一个是符号位0,其他的全部为1,就是正数的最大值)
那么此时如果加1,会进位成:
10000000 00000000 00000000 00000000
各位想一想,符号位为1,那么此时表示的不就是一个负数了吗?我们回想一下负数的补码表示规则,瞬间就能明白了,这不就是补码形式下的最小值了吗?
所以说最后的结果就是int类型的最小值:-2147483648,是不是感觉了解底层原理会更容易理解这是为什么。
浮点类型
float 单精度浮点型 (32bit,4字节)
double 双精度浮点型(64bit,8字节)
那么小数在计算机中又是如何存放的呢?
public class Main {
public static void main(String[] args) {
float a =1.2f;
double b = 23.4d;
System.out.println(a);
System.out.println(b);
}
}
字符类型
字符型char在Java语言中占用 2 个字节,char类型的字面量必须使用半角的单引号括起来。
public class Main {
public static void main(String[] args) {
char a ='男';
System.out.println(a);
}
}
布尔类型
在Java开发过程中boolean 型只有两个取值 true 和 false。
public class Main {
public static void main(String[] args) {
boolean a =true;
System.out.println(a);
}
}
数据类型转换
自动类型转换
转换从低级到高级:
byte,short,char—> int —> long—> float —> double
public class Main {
public static void main(String[] args) {
char a = 'M';
int b = 12;
System.out.println(a+b);
}
}
数据类型转换必须满足如下规则:
- 不能对boolean类型进行类型转换。
- 不能把对象类型转换成不相关类的对象。
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
- 转换过程中可能导致溢出或损失精度
强制性类型转换
- 条件是转换的数据类型必须是兼容的。
- 格式:(type)value type是要强制类型转换后的数据类型
public class Main {
public static void main(String[] args) {
byte a = 1;
int b =(int)a;
System.out.println(b);
}
}