一、数据类型转换
变量定义赋值的时候, 值得在取值范围之内,自动转换. 如果超出了接收类型的范围, 需要强转
1. 自动转换
自动转换也叫隐式转换,是代码执行过程中取值范围小的类型自动转换为取值范围大的类型。
转换规则
数据类型的范围大小排序
byte、short、char < int < long < float < double
范围小的类型向范围大的类型转换,但是byte、short、char在运算过程中是直接转换为int
byte b1=1;
byte b2=1;
byte b3=b1+b2; //这里会报错,在运算过程中byte自动转换为int,运算后就不能再用byte接收,b3应为int类型
System.out.println(b3);
short s1=1;
short s2=1;
short s3=s1+s2;//这里和上边的byte报错一样,s3应为int类型
System.out.println(s3);
char c1=1;
char c2=1;
char c3=c1+c2;//c3应为int类型
System.out.println(c3);
2. 强制转换
强制转换就是把一个范围大的数据类型强制转换为范围小的数据类型,
转换格式:
int i1 =(int)1.0;
数据类型 变量名 = (数据类型)被转数据值;
举例:
int a = 2.0; //在编译阶段就会报错,不兼容类型,需要从double转换为int,可能会有损失
System.out.printl(a);
//如果一定要转换的话
int b = (int)2.2;
System.out.printl(b); //结果为2,小数点后的没有了,这就造成了精度损失
下边通过一个简单的例子介绍一下强制转换的原理:
byte占用一个字节,取值范围是[-128,127],如果我们把257强制转换为byte呢?
byte a = (byte)257;
System.out.println(a); //运行发现结果为1
造成这一结果的原因:
强制转换要注意:
精度损失:浮点转换为整数直接取消小数点,舍弃小数点后的数据
数据溢出:范围大的数据类型转换为范围小的类型,有可能超过范围小的数据类型的取值范围,造成数据丢失。
3. ASCII编码表
编码表 就是将人类的字符和一个十进制数进行对应起来组成一张表格。表中每个文字都对应了一个数值,如下:
字符 | 数值 |
0 | 48 |
9 | 57 |
A | 65 |
Z | 90 |
a | 97 |
z | 122 |
这些只用记得几个就可以,其他的可以直接推断出来。
二、运算符
1. 算数运算符
算数运算符包括: | |
+ | 加法运算,字符串连接运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
% | 取模运算,两个数字相除取余数 |
++ -- | 自增自减运算 |
运算符两侧的数据类型要一致,(byte、short、char类型自动转换为int)
int a = 10;
int b = 20;
int c = a + b ;//a,b都是int类型,可以赋值给int类型的c
byte x = 1;
byte y = 2;
byte z = x + y; //这样会报错,因为在运算过程中,byte转换成了int,如果还需要用byte接收需要强制转换,可能会有损失
int z1 = x + y; //需要int类型的变量接收,因为运算结果提升到了int
运算两侧的类型不一致时,结果要和大的数据类型保持一致
double a = 100;
int b = 10;
int c = a + b; //错误;运算结果从double转换为int可能会有精度损失,编译报错
double c = a + b;//当运算的两个数据的数据类型不一致时,接收结果的变量数据类型与大的范围的数据类型保持一致
2. ++、--运算符
独立运算:变量在独立运算时,前++和后++没有区别,都是实现自动加1的功能
i++; ++i;
混合运算:和其他变量放一起时就有区别。
比如:++i是先把i+1在运算
int a = 1;
int b = ++a;
System.out.println(a);//计算结果是2
System.out.println(b);//计算结果是2
变量a自己加1,将加1后的结果赋值给b,也就是说a先 +1 计算得到2,然后复制给b,
因此,a和b的结果都是2。
i++:先取值后运算
int a = 1;
int b = a++;
System.out.println(a);//计算结果是2
System.out.println(b);//计算结果是1
变量a先把自己的值1赋值给变量b,此时变量b的值就是1。然后变量a再去自己再加1。
因此,a的结果是2,b的结果是1。
3. +字符串中的拼接作用
+
符号在遇到字符串的时候,表示连接、拼接的含义。
"a"+"b"的结果是“ab”,连接含义
System.out.println("5+5="+5+5);//输出5+5=55
注意:当和加法运算结合在一起的时候,要注意用() 提升运算优先级
4. 赋值运算符
运算符 | 说明 |
= | 等于号 |
+= | 加等于 |
-= | 减等于 |
*= | 乘等于 |
/= | 除等于 |
%= | 取模等 |
赋值运算符 =
将=
右边的值,赋给左边的变量。其实我们昨天在学习定义变量的时候就接触了。如
int i1 = 5; //将整数常量5赋值给i1。
int i2 =i1; //将i1变量的值赋值给i2变量。
int i3 =i1+i2; //将i1+i2的运算结果赋值给变量i3
+=,-=,*=,/=,%=
运算符和赋值符的结合使用。当运算的时候,有时我们会遇到如下运算需求:
int i1=10;
i1=i1+100;//变量自身参与运算,结果赋值返回给自身
i1+=100;
System.out.println(i1);
//其他几个运算符也是一样使用
+= ,-=,*=,/=,%=:自动类型强转功能
在运算过程中,如果涉及到值强转,会自动操作不需要我们手动转换;
byte b1=1;
//b1= b1+ 256;//编译报错
b1+=256;
System.out.println(b1);//值为1,而不是257. int 强转为 byte ,溢出
int i1=10;
i1*=1.234;
System.out.println(i1);//值为12,而不是12.34 double 强转为 byte ,精度损失
5. 比较运算符
比较运算符 | 说明 |
== | 比较符号两边数据是否相等,相等结果是true。 |
< | 比较符号左边的数据是否小于右边的数据,如果小于结果是true。 |
> | 比较符号左边的数据是否大于右边的数据,如果大于结果是true。 |
<= | 比较符号左边的数据是否小于或者等于右边的数据,如果小于结果是true。 |
>= | 比较符号左边的数据是否大于或者等于右边的数据,如果大于结果是true。 |
!= | 不等于符号 ,如果符号两边的数据不相等,结果是true。 |
比较运算符,是两个数据之间进行比较的运算,运算结果都是布尔值true
或者false
。
public static void main(String[] args) {
System.out.println(1==1);//true
System.out.println(1<2);//true
System.out.println(3>4);//false
System.out.println(3<=4);//true
System.out.println(3>=4);//false
System.out.println(3!=4);//true
}
6. 逻辑运算符
逻辑运算符其实就是与(并且),或(或者),非(不是)
,用来连接两个布尔类型结果
的运算符。其运算结果都是布尔值(true
或false
)
逻辑运算符 | 称呼 | 使用说明 |
&& | 双与 短路与 | 1. 两边都是true,结果是true 2. 一边是false,结果是false 短路特点: 一假即假。符号左边是false,右边不再运算,效率比单与高。 |
|| | 短路或 双或 | 1. 两边都是false,结果是false 2. 一边是true,结果是true 短路特点:一真即真,符号左边是true,右边不再运算,效率比单或高 |
! | 取反 | 1. ! true 结果是false 2. ! false结果是true |
7. 三元运算符
当一个布尔表达式的结果( true 或者 false) 需要对应两种不同的结果时, 我们可以使用三元运算符.
表达式可: 由变量
或常量
和操作符
组成的式子构成。
三元运算符格式:
数据类型 变量名 = 布尔类型表达式 ?真值 :假值;
1. 布尔类型表达式结果是true,三元运算符整体结果为真值,赋值给变量。
2. 布尔类型表达式结果是false,三元运算符整体结果为假值,赋值给变量。
注意: 后面真值和假值的数据类型要和 变量接收的类型要匹配
int score = 59;
String status= score>=60 ? "及格" : "不及格" ; // 不及格
System.out.println(status); // score=80 及格 score=59 不及格