数值型
- 字节型变量 --byte
基本语法格式:byte 变量名 = 初始值;
字节类型的变量只占1个字节,表示的数据范围较小(-128~127); - 短整型变量 --short
基本语法格式:short 变量名 = 初始值;
short占用2个字节,表示的数据范围是(-32768~32767); - 整型变量 --int
基本语法格式:int 变量名 = 初始值;
在java中,一个int型的变量占4个字节(8个二进制位bit>表示一个字节byte>),4个字节表示的数据范围为(-231~231-1),大概是-21亿到21亿.
查看java中整型变量的数据范围:
System.out.println(Integer.MAX_VALUE); // int 的最大值
System.out.println(Integer.MIN_VALUE); //int的最小值
- 长整型变量 --long
基本语法格式:long 变量名 = 初始值;
定义整型int时,初始化写为:int num= 10;而定义长整型时,写作:long num = 10l;或者long num = 10L;
在java中,long型变量占8个字节表示的数据范围为(-263~263-1);
查看长整型的数据范围:
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE)
// 运行结果
9223372036854775807
-9223372036854775808
long型变量能表示的数据范围远远超过了int型,能满足目前大多数项目的使用.
-
单精度浮点型变量 --float
基本语法格式:float 变量名 = 初始值;
float num = 1.0f;或写成float num = 1.0F;
float类型的变量在java中占4个字节,表示的精度相较double类型来说较小,所以一般优先考虑使用double类型. -
双精度浮点型变量 --double
基本语法格式:double 变量名 = 初始值;
double num = 1.0;
在java中,double类型的变量占8个字节
字符型 --char
基本格式:char 变量名 = 初始值;
char ch = ‘A’; 定义字符时,用单引号+单个字母表示字符字面值;java中使用Unicode表示字符,因此一个字符占2个字节
布尔型 --boolean
基本数据格式:boolean 变量名 = 初始值;
boolean类型只有两种取值:true表示真,false表示假;在java中boolean型和int型之间不能转换,1不能表示true,0不能表示false;boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位,没有明确规定;
变量的命名规则
- 一个变量名只能包含数字, 字母, 下划线;
- 数字不能开头;
- 变量名是大小写敏感的. 即 num 和 Num 是两个不同的变量;
- 变量命名推荐小驼峰命名法, 当一个变量名由多个单词构成的时候, 除了第一个单词之外, 其他单词首字母都大写;
常量
常量指运行时类型不能发生改变
1.字面值常量
10 // int 字面值常量(十进制)
010 // int 字面值常量(八进制) 由数字 0 开头. 010 也就是十进制的 8
0x10 // int 字面值常量(十六进制) 由数字 0x 开头. 0x10 也就是十进制的 16
10L // long 字面值常量. 也可以写作 10l (小写的L)
1.0 // double 字面值常量. 也可以写作 1.0d 或者 1.0D
1.5e2 // double 字面值常量. 科学计数法表示. 相当于 1.5 * 10^2
1.0f // float 字面值常量, 也可以写作 1.0F
true // boolen 字面值常量, 同样的还有 false
‘a’ // char 字面值常量, 单引号中只能有一个字符
2.final关键字修饰的常量
final int a = 10;
a = 20; // 编译出错. 提示 无法为最终变量a分配值
常量在程序运行过程中不能发生修改
类型转换
- int和long,double相互赋值
int a = 10;
long b = 20;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过.
int a = 10;
double b = 1.0;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过
-
long 表示的范围更大, 可以将 int 赋值给 long, 但是不能将 long 赋值给 int.
-
double 表示的范围更大, 可以将 int 赋值给 double, 但是不能将 double 赋值给 int.
结论: 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型, 反之则不行
- int和boolean相互赋值
int a = 10;
boolean b = true;
b = a; // 编译出错, 提示不兼容的类型
a = b; // 编译出错, 提示不兼容的类型
结论: int 和 boolean 是毫不相干的两种类型, 不能相互赋值.
- int字面值常量给byte赋值
byte a = 100; // 编译通过
byte b = 256; // 编译报错, 提示 从int转换到byte可能会有损失
byte类型表示的数据范围是-128~127 ,而256超出了byte所能表示的范围;
- 使用强制类型转换
int a = 0;
double b = 10.5;
a = (int)b;
int a = 10;
boolean b = false;
b = (boolean)a; //编译出错,提示不兼容的类型
结论:使用类型强制转换的方式可以将double类型转化为int类型,但是强制类型转换会导致数据精度丢失,赋值之后,10.5就变成了10,小数点后面的部分直接被忽略;强制类型转换不一定会成功,boolean型和int型之间无法强转,互不相干的类型之间不能强转.
类型提升
- int和long的混合运算
int a = 10;
long b = 20;
int c = a + b; // 编译出错, 提示将 long 转成 int 会丢失精度
long d = a + b; // 编译通过
结论: 当 int 和 long 混合运算的时候, int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long 类型的变量来接收结果. 如果非要用 int 来接收结果, 就需要使用强制类型转换
- byte和byte的运算
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
// 编译报错
Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失
byte c = a + b;
^
虽然a和b都是byte类型,但是还会编译错误,是由于在计算byte类型的数值时,会将类型先提升为int型,再进行计算,所以a和b都是先被提升为int型,再进行a+b;而此时的a+b也是int型,再赋给byte型的c,就出现了编译错误;
结论:由于计算机的CPU通常是按照4个字节为单位从内存中读取数据,为了硬件上实现方便,像byte和short这种低于4个字节的类型,会先提升成int型再计算.
正确写法:
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);
未完待续…