一、常量\变量
常量:是指在Java程序中固定不变的数据。
类型 | 含义 | 数据举例 |
---|---|---|
整数常量 | 所有的整数 | 0,1,567,-9 |
小数常量 | 所有的小数 | 0.0,-0.1,2.5 |
字符常量 | 单引号引起来,只能写一个字符,必须有内容 | ‘a’ , ‘(空格)’ ,‘好’ |
字符串常量 | 双引号引起来,可以写多个字符,也可以不写 | “A” ,“Hello”,“你好”,"" |
布尔常量 | 只有两个值 | true,false |
空常量 | 只有一个值 | null |
数据类型:
- 基本数据类型: 包括
整数
、浮点数
、字符
、布尔
- 引用数据类型: 包括
类
、数组
、接口
、Lambda
四类八种基本数据类型:
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1个字节 | -128 至 127 -2^7 到 2^7-1 |
短整型 | short | 2个字节 | -32768 至 32767 -215到215-1 |
整型 | int(默认) | 4个字节 | -231 至 231-1 大概范围是正负21亿之间 |
长整型 | long | 8个字节 | -263 至 263-1 |
单精度浮点数 | float | 4个字节 | 1.4013E-45 至 3.4028E+38 |
双精度浮点数 | double(默认) | 8个字节 | 4.9E-324 至 1.7977E+308 |
字符型 | char | 2个字节 | 0 至 216-1 |
布尔类型 | boolean | 1个字节 | true,false |
变量:常量是固定不变的数据,那么在程序中可以变化的量称为变量。
变量定义的格式包括三个要素:数据类型
、 变量名
、 数据值
。
数据类型 变量名 = 数据值;
注意事项
:
- 变量名称:在同一个大括号范围内,变量的名字不可以相同。
- 变量赋值:定义的变量,不赋值不能使用。
- 给float和long类型的变量赋值,记得加F和L
- 超过了变量的作用域,就不能再使用变量了 作用域: 从定义变量的位置开始,一直到直接所属的大括号结束为止
- 同一条语句可以同时定义多个同类型的变量
- 如果给byte和short类型的变量赋值,记得不要超过该类型所表示的范围
二、类型转换
自动转换:将取值范围小的类型
自动提升为取值范围大的类型
。
byte
类型内存占有1个字节,在和int
类型运算时会提升为int
类型 ,自动补充3个字节,因此计算后的结果还是int
类型。
转换原理图解:
同样道理,当一个int
类型变量和一个double
变量运算时,int
类型将会自动提升为double
类型进行运算。
public static void main(String[] args) {
int i = 1;
double d = 2.5;
//int类型和double类型运算,结果是double类型
//int类型会提升为double类型
double e = d+i;
System.out.println(e);
}
转换规则:
范围小的类型向范围大的类型提升,byte、short、char
运算时直接提升为int
。
byte、short、char-->int-->long-->float-->double
强制类型转换:将取值范围大的类型
强制转换成取值范围小的类型
转换格式:
数据类型 变量名 = (数据类型)被转数据值;
转换原理图解:
强烈注意
:
- 强制类型转换,可能造成数据损失精度。
- byte \ short \ char 这三种数据类型可以发生数学运算,但是会首先提升到 int 类型
- boolean类型的不能发生强制类型转换
// 定义s为short范围内最大值
short s = 32767;
// 运算后,强制转换,砍掉2个字节后会出现不确定的结果
s = (short)(s + 10);
短路问题:
逻辑与运算符&的左边为false
,那么右边就不会运算;
逻辑与运算符||的左边为true
,那么右边就不会运算。
eg:
//逻辑与运算符
int num = 3;
System.out.println(1 > 2 && num++ > 2); //false
System.out.println(num); //num = 3
//逻辑或运算符
int num2 = 2;
System.out.println(1 < 2 || num2++ > 2); //true
System.out.println(num2); //num = 3
三、常量与变量的运算
public static void main(String[] args){
byte b1=1;
byte b2=2;
byte b3=1 + 2;
byte b4=b1 + b2;
System.out.println(b3);
System.out.println(b4);
}
分析:b3 = 1 + 2
,1
和 2
是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了1+2
的结果并没有超过byte类型的取值范围,可以赋值给变量b3
,因此b3=1 + 2
是正确的。
反之,b4 = b2 + b3
,b2
和 b3
是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果是什么,因此会将结果以int类型进行处理,所以int类型不能赋值给byte类型,因此编译失败。
四、+=符号
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
分析: s += 1
逻辑上看作是s = s + 1
计算结果被提升为int类型,再向short类型赋值时发生错误,因为不能将取值范围大的类型赋值到取值范围小的类型。但是,s=s+1进行两次运算
,+=
是一个运算符,只运算一次,并带有强制转换的特点,也就是说s += 1
就是s = (short)(s + 1)
,因此程序没有问题编译通过,运行结果是2.