一、类型转换
含义
将一种数据类型转换为另一种数据类型
分类
- 基本类型的转换
- 引用类型的转换
- 基本类型和包装类型的转换
- 基本类型和字符类型的转换
基本类型的转换
含义
将一种基本类型的数据转换为另一种基本类型的数据。
分类
- 自动转换(隐性转换)
-
- 含义:将基本类型取值范围较小的转换为基本类型取值范围较大的数据类型。
- 基本类型取值范围从小到大的关系:
-
-
- byte<short<int<long<float<double
- char<int<long<float<double
-
基本类型自动转换的面试题:
在程序中,long类型数据占8个字节,float类型数据占4个字节,为什么float类型可以存储long类型变量?
回答:
(1)基本类型的自动转换只和基本类型的取值范围有关,和基本类型所在内存字节数无关
(2)float类型之所以可以存储long类型变量,主要是二者的底层的数据结构不同
long类型:十进制数据
float类型:不是十进制数据,底层是IEEE754的浮点计数标准
(3)通过真实数据验证float类型的取值范围比long类型的取值范围大
long类型取值范围:-2^63 ~ 2^63-1,其中long类型取的最大值肯定<2^63
float类型取值范围:约为-3.4*10^38~3.4*10^38,其中float类型取的最大值肯定>3.4*10^38
- 强制转换(显式转换)
-
- 含义:将取值范围较大的转换为取值范围较小的数据类型。
- 分类:
-
-
- 通过添加字母进行强制转换,long类型需增加L,float需要加F。
- 通过类型转换格式进行(数据类型2 变量名 = (数据类型2)数据类型2的数据值)
-
注意事项
- 尽量避免使用强行转换,可能会产生数据或者数据溢出。
- booblean类型不参与数据转换,剩下7种可以。
- byte、short、char在进行加减运算时会暂时提升为int形进行运算,其余正常。
- 自动转换可通过隐式完成也可以通过转换格式进行。
二、常量
含义
在程序中其值不可发生转换的量。
分类
自定义常量(暂不涉及,讲final关键字时会具体讲解)
字面值常量
含义
就是一个单独的一个值,字面值常量单独使用无意义,需要结合其他代码使用。
分类
- 整数型字面常量
- 浮点型字面常量
- 布尔形字面常量
- 字符串型字面查改良
- 字符形字面常量
- 空常量——不可以直接打印。
注意事项
- 在程序中给byte,short,char进行赋值时,如果初始化值在常量的取值范围内JVM会自动将初始化值进行优化为该数据类型,称之为“常量优化机制”。
- 如果是一个式子的话,也会在JVM中先进行计算如果结果在变量取值范围内在进行优化为该数据类型后储存,称之为“常量优化机制”。
三、运算符
含义
程序中用来连接常量或变量的符号。
表达式
含义
在程序中用运算符串联起来的式子。
常用的运算符分类
算数运算符
- 数学运算:+ - * / %
- 自增减运算 ++、--
//获取一个四位数的各个位上的数字
class Day02Demo01{
public static void main(String[] args){
int num = 8465;
int ge = num % 10;
int shi = num / 10 % 10
int bai = num / 100 % 10;
int qian = num /1000 % 10;
System.out.println("ge = " + ge);
System.out.println("shi = " + shi);
System.out.println("bai = " + bai);
System.out.println("qian = " + qian);
}
}
赋值运算符
含义
给变量或常量进行赋值操作的运算符。
单独赋值运算符
将数值赋值给对应数据类型变量。
复合赋值运算符
将复合赋值运算符左右两边的内容进行运算后在赋值给左边变量。
注意事项
- 复合赋值运算在赋值给左边前会在右边进行强制隐性转换。
- 在复合赋值运算时若右边为一个式子,会先运算右边式子之后再进行复合赋值运算。
关系运算符
含义
获取两个数值之间的关系
注意
- 关系是的结果 一定为booblean值。
逻辑运算符
含义
根据实际需求判断多个条件的运算符。
分类
- 单独逻辑运算符
-
- & 且:有false则false。
- | 或:有ture则ture。
- ^ 异或:相同 false 不同ture。
- !非:取相反。
- 短路逻辑运算符
-
- &&和&区别在于&&若执行左边式子后判定为false输出就不会经过右边式子。
三元运算符
含义
在程序中含有三个未知量的运算符
格式
关系式?结果值1:结果值2;
执行流程
- 判断关系式类型。
- 在确认关系的同时若表达式1、2的类型不同会统一结果值的数据类型
- 若为turn执行结果值1 ,false执行结果值2。
boolean ==> Boolean ==> Object
String ==> Object
运算符的优先级
- Java运算中优先级并不是按照表进行的,实际是从等式右边的式子从左到右依次进行的,实际上优先级表仅仅只是反映的运算速度快慢。
- 程序表达式不建议写太过复杂,建议拆分几步完成。
- 程序中不应依赖优先级进行排序,如需要请使用()进行分配优先级。
- 若表达式中出现了复合赋值运算,建议先拆分后进行。
- 如果表达式两边都出现了相同变量,且存在自增自减的情况需要特殊关注运算符的优先级。
- 除了自增减外,出现()需要特殊关注运算符优先级的问题。
- 除了以上特点外其他遵循基本运算优先级。
四、源码,反码,补码
相同点
三者均为二进制定点标识法,有以下两点规定
- 二进制位数需要和数据在内存中字节数量对应,不足的需要补0。
- 源反补规则的符号位及是最高位符号,正0符1。
不同点
- 源码:计算机显示数据的二进制代码。
- 补码:计算机中一切计算都使用补码进行。
- 反码:源码和补码互相转换时的中间量。
五、位移运算符
含义
针对二进制直接进行操作的运算符
分类
- 按位运算符
-
- &
-
-
- 按位与
- 同时1则1,包含符号位。
- -4 & -25
-
-4 | 10000000 | 00000000 | 00000000 | 00000100 |
反 | 11111111 | 11111111 | 11111111 | 11111011 |
补 | 11111111 | 11111111 | 11111111 | 11111100 |
-25 | 10000000 | 00000000 | 00000000 | 00011001 |
反 | 11111111 | 11111111 | 11111111 | 11100110 |
-25补 | 11111111 | 11111111 | 11111111 | 11100111 |
-4补 | 11111111 | 11111111 | 11111111 | 11111100 |
结果补 | 11111111 | 11111111 | 11111111 | 11100100 |
结果反 | 11111111 | 11111111 | 11111111 | 11100011 |
结果 | 10000000 | 00000000 | 00000000 | 00011100 |
-
- |
-
-
- 按位或
- 有1则1,包含符号位。
- -4 | -25
-
-4 | 10000000 | 00000000 | 00000000 | 00000100 |
反 | 11111111 | 11111111 | 11111111 | 11111011 |
补 | 11111111 | 11111111 | 11111111 | 11111110 |
-25 | 10000000 | 00000000 | 00000000 | 00011001 |
反 | 11111111 | 11111111 | 11111111 | 11100110 |
补 | 11111111 | 11111111 | 11111111 | 11100111 |
-4补 | 11111111 | 11111111 | 11111111 | 11111110 |
结果补 | 11111111 | 11111111 | 11111111 | 11111111 |
结果反 | 11111111 | 11111111 | 11111111 | 11111110 |
结果 | 10000000 | 00000000 | 00000000 | 00000001 |
-
- ^
-
-
- 按位异或
- 相同0,不同1,包括符号位。
-
-4 | 10000000 | 00000000 | 00000000 | 00000100 |
反 | 11111111 | 11111111 | 11111111 | 11111011 |
补 | 11111111 | 11111111 | 11111111 | 11111100 |
-25 | 10000000 | 00000000 | 00000000 | 00011001 |
反 | 11111111 | 11111111 | 11111111 | 11100110 |
补 | 11111111 | 11111111 | 11111111 | 11100111 |
-4补 | 11111111 | 11111111 | 11111111 | 11111100 |
结果补 | 00000000 | 00000000 | 00000000 | 00011011 |
结果反 | 00000000 | 00000000 | 00000000 | 00011011 |
结果 | 00000000 | 00000000 | 00000000 | 00011011 |
-
- ~
-
-
- 按位非
- 逐行取反包括符号位。
-
- 位移运算符
-
- <<
-
-
- 将数据二进制向左移动2位数,符号位也会进行移动,右侧空位补0.
-
-
- >>
-
-
- 将数据向有移动2位,符号位也进行移动左侧按照符号位补。
-
-
- >>>
-
-
- 将数据二进制向右移动2位,左侧补0
-
优势
- JDK中的API源码有部分使用。
- 运行效率相比于其他会高。