Java变量,数据类型转换,运算符,逻辑控制语句
一.变量
1.变量的作用域:
变量能生效的范围,一般是变量定义所在的代码块(大括号内)
2.变量的命名规则
- 一个变量名只能包含字母,数字,下划线
- 数字不能开头
- 英文大小写敏感,Num和num是两个不同的变量
注:
a.不推荐用中文/美元符号命名
b.推荐小驼峰命名法(当一个变量名由多个单词构成的时候,除了第一个单词之外,其他单词首字母大写)
二.常量:常量指的是运行时类型不能发生改变,只能初始化一次,eg:被 final 修饰的变量是常量
三:数据类型转化
1. int和 long/ double相互赋值
结论:
不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型,反之不行
2. int和boolean相互赋值
结论:
int和boolean是毫不相干的两种类型,不能相互赋值
3. int字面值常量给byte赋值
Byte表示的数据范围是-128~127,267超过范围
4.强制类型转换
类型转化小结:
1.不同类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型
2.若要将范围大的赋值给范围小的,需要强制类型转换,可能会丢失精度
3.将一个字面值常量进行赋值的时候,Java会自动针对数字范围进行检查
5.数值提升
a. int和 long 混合运算
结论:
当 int 和 long 混合运算的时候, int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long类型的变量来接收结果. 如果非要用 int 来接收结果, 就需要使用强制类型转换.
b.byte和byte的运算
结论:
byte 和byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b都提升成 int, 再进行计算, 得到的结果也是int, 这时赋给 c, 就会出现上述错误.由于计算机的 CPU 通常是按照 4个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short 这种低于4 个字节的类型, 会先提升成 int,再参与计算.
类型提升小结:
- 不同类型的数据混合运算, 范围小的会提升成范围大的.
- 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.
6.int 和 string 之间的相互转换
总结
四. 运算符
1.除法: /
注: 0 不能作为除数
异常:
- 编译时期异常(受查异常):一定要由程序员进行异常的处理程序才能运行
- 运行时期异常(非受查异常):是程序在运行的过程当中所发生的异常
public static void main(String[] args) {
System.out.println(1/0);
}
2.求余:%
3.复合运算符 += -= *= /= %= ++ –
int a = 10;
a += 1; // 等价于 a = a + 1
System.out.println(a);
可以自动进行类型转化
特例:
4.关系运算符
== != < > <= >=
注:Java当中所有的关系比较,其结果就是true或者是false
5.逻辑运算符
1.逻辑与 &&
注:表达式1表达式2必须都是布尔表达式
规则: 两个操作数都为 true, 结果为 true, 否则结果为 false.
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b && b < c);
2.逻辑或 ||
规则: 两个操作数都为 false, 结果为 false, 否则结果为 true
注:表达式1表达式2必须都是布尔表达式
int a = 10;
int b = 20;
int c = 30;
System.out.println(a < b || b < c);
3.逻辑非 !
规则: 操作数为 true, 结果为 false; 操作数为 false, 结果为 true(这是个单目运算符, 只有一个操作数).
int a = 10;
int b = 20;
System.out.println(!a < b);
6.短路求值
- 对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式.
- 对于 ||, 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式.
7.位运算符:& | ~ ^
1.按位与 &: 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.
2.按位或 |: 如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.
3.按位取反 ~: 如果该位为 0 则转为 1, 如果该位为 1 则转为 0
4.按位异或 ^: 如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.
注意:
- 0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4 个二进 制位.
- 0xf 表示 10 进制的 15, 也就是二进制的 1111
- printf 能够格式化输出内容, %x 表示按照十六进制输出.
- \n 表示换行符
8.移位运算:<< >> >>>
左移 <<: 最左侧位不要了, 最右侧补 0
右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
无符号右移 >>>: 最右侧位不要了, 最左侧补 0.
注意:
- 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
- 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
- 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
- 移动负数位或者移位位数过大都没有意义.
9.条件运算符
表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.也是 Java 中唯一的一个 三目运算符
注释
- 单行注释:// 注释内容(用的最多)
- 多行注释:/* 注释内容*/(不推荐)
- 文档注释: /** 文档注释 */(常见于方法和类之上描述方法和类的作用),可用来自动生成文档
五.逻辑控制
分支结构
1.if语句
单分支
if(布尔表达式){
//条件满足时执行代码
}
双分支
if(布尔表达式){
//条件满足时执行代码
}else{
//条件不满足时执行代码
}
多分支
if(布尔表达式){
//条件满足时执行代码
}else if(布尔表达式){
//条件满足时执行代码
}else{
//条件都不满足时执行代码
}
scanner用法:
public static void main(String[] args) {
//循环输入
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()){
// scanner.nextLine();一般有nextLine()的时候把它放在第一行
int a = scanner.nextInt();
System.out.println(a);
}
scanner.close();//ctr+d 关闭
}
}
三种输出方式:
System.out.println(a);//输出且换行
System.out.print(a);//输出不换行
System.out.printf("%d/n",a);//格式化输出
题:不能做switch参数的类型有哪些?
答:long,fioat double boolean
2.switch语句
switch(整数|枚举|字符|字符串){
case 内容1 : {
内容满足时执行语句;
[break;]
}
case 内容2 : {
内容满足时执行语句;
[break;]
}
...
default:{
内容都不满足时执行语句;
[break;]
}
}
循环结构
1. while 循环
while(循环条件){
循环语句;
}
循环条件为 true, 则执行循环语句; 否则结束循环.
break:结束所有循环 跳出循环
continue:结束本趟循环
2.for 循环
(1)for(表达式1;表达式2;表达式3){
循环体;
}
表达式1: 用于初始化循环变量.
表达式2: 循环条件,2没写默认true
表达式3: 更新循环变量.
相比于 while 循环, for 循环将这三个部分合并在一起, 写代码时不容易遗漏
执行顺序:1,2,循环体,3,2,循环体,3,2,循环体,3 .。。
(2)增强for循环。foreach
int[] arr = {1,2,3,4,5};
for(int x : array){
System.out.println(x);
}
3.do while 循环
基本语法
do{
循环语句;
}while(循环条件);
先执行循环语句, 再判定循环条件
注:循环至少执行一次,不建议使用