整型变量
整型 | 所占字节数 | 数据范围 |
---|---|---|
byte | 1个 | [-128,127] |
short | 2个 | [-32768,32767] |
int | 4个 | [-2^31, 2^31-1] |
long | 8个 | [-2^63, 2^63-1] |
注意:所占字节数与操作系统无关
字节是计算机中表示空间大小的基本单位
计算机使用二进制表示数据. 我们认为 8 个二进制位(bit) 为一个字节(Byte).
1KB = 1024 Byte, 1MB = 1024 KB, 1GB = 1024 MB
4 个字节表示的数据范围是 -2^31 -> 2^31-1 , 也就大概是 -21亿 到 +21亿
public class Solution {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
}
如果超出范int的最大范围,就会出现溢出的情况
public class Solution {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE + 1);
}
我们发现int最大值+1,反而成为最小值了,针对这种情况, 我们就需要使用更大范围的数据类型来表示,引入long长整型变量
- 基本语法格式和创建 int 变量基本一致, 只是把类型修改成 long
- 初始化设定的值为 10L , 表示一个长整型的数字. 10l 也可以
public class Solution {
public static void main(String[] args) {
System.out.println(Long.MAX_VALUE );
System.out.println(Long.MIN_VALUE );
}
}
相比于int ,long的取值范围更大
浮点型变量
浮点类型 | 所占字节数 |
---|---|
float | 4个 |
double | 8个 |
都遵守 IEEE 标准
public class Solution {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a / b);
}
}
原因是因为整型除以整型还是整型,所以我们应改为double类型
public class Solution {
public static void main(String[] args) {
double a = 1;
double b = 2;
System.out.println(a / b);
}
再看一个例子
public class Solution {
public static void main(String[] args) {
double a = 1.1;
System.out.println(a * a);
}
}
结果却是
原因是因为尝试使用有限的内存空间表示可能无限的小数,势必会存在一定的精度误差。
单精度浮点型变量float初始值
float num = 1.0f; // 写作 1.0F 也可以
由于表示的数据精度范围较小, 一般在工程上用到浮点数都
优先考虑 double, 不太推荐使用 float。
字符类型变量
char ch = 'A';
char a = '啊';
计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一个字符占用两个字节, 表示的字符种类更多, 包括中文。
注意:字节类型和字符类型互不相干
布尔类型变量
- boolean 类型的变量只有两种取值, true 表示真, false 表示假.
- Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法.
- boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位, 这个没有明确规定
字符串类型变量
1.和上面的类型不同, String 不是基本类型, 而是引用类型(后面重点解释).
2. 字符串中的一些特定的不太方便直接表示的字符需要进行转义
转义字符 | 解释 |
---|---|
\n | 换行 |
\t | 水平制表符 |
\ ’ | 单引号 |
\ " | 双引号 |
\ \ | 反斜杠 |
public class Solution {
public static void main(String[] args) {
String str = "result = ";
int a = 10;
int b = 20;
String result = str + a + b;
System.out.println(result);
}
}
以上代码说明, 当一个 + 表达式中存在字符串的时候, 都是执行字符串拼接行为.
变量的作用域
也就是该变量能生效的范围, 一般是变量定义所在的代码块 (大括号)
变量的命名规则
- 一个变量名只能包含数字, 字母, 下划线
- 数字不能开头
- 大小写敏感
类名建议大驼峰命名:FirstTest
变量名和方法名建议小驼峰命名法:maxValue
常量
- 字面值常量
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 字面值常量, 单引号中只能有一个字符 |
“abc” | String 字面值常量, 双引号中可以有多个字符 |
- final 关键字修饰的常量
报错原因是:常量不能在程序运行过程中发生修改.
类型转换
int 和 long/double 相互赋值
public class Solution {
public static void main(String[] args) {
int a = 10;
long b = 20;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过.
int a = 10;
double b = 1.0;
a = b; // 编译出错, 提示可能会损失精度.
b = a; //编译通过.
}
}
结论: 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型, 反之则不行
int 和 boolean 相互赋值
int a = 10;
boolean b = true;
b = a; // 编译出错, 提示不兼容的类型
a = b; // 编译出错, 提示不兼容的类型
结论: int 和 boolean 是毫不相干的两种类型, 不能相互赋值
int字面值常量 给 byte 赋值
byte a = 100; // 编译通过
byte b = 256; // 编译报错, 提示从int转换到byte可能会有损失
结论: 使用字面值常量赋值的时候, Java 会自动进行一些检查校验, 判定赋值是否合理
使用强制类型转换
int a = 0;
double b = 10.5;
a = (int)b;
int a = 10;
boolean b = false;
b = (boolean)a; // 编译出错, 提示不兼容的类型
结论:
- 强制类型转换可能会导致精度丢失. 如刚才的例子中, 赋值之后, 10.5 就变成 10 了, 小数点后面的部分被忽略.
- 强制类型转换不是一定能成功, 互不相干的类型之间无法强转
类型转换小结
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型.
- 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失.
- 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查
数值提升
小结:
- 不同类型的数据混合运算, 范围小的会提升成范围大的.
- 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算