运算符 :
// &是只要有0结果就是0
// 0000 0000 0000 0000 0000 0000 0101 1010 &
// 0000 0000 0000 0000 0000 0000 1100 0011 =
// 0000 0000 0000 0000 0000 0000 0100 0010 => 0x42 -> 66
System.out.println(n1 & n2);
// |是只要有1结果就是1
// 0000 0000 0000 0000 0000 0000 0101 1010 |
// 0000 0000 0000 0000 0000 0000 1100 0011 =
// 0000 0000 0000 0000 0000 0000 1101 1011 => 0xDB -> 13 * 16 + 11
System.out.println(n1 | n2);
// ^是只要不同就是1
// 0000 0000 0000 0000 0000 0000 0101 1010 |
// 0000 0000 0000 0000 0000 0000 1100 0011 =
// 0000 0000 0000 0000 0000 0000 1001 1001 => 0x99 -> 9 * 16 + 9
System.out.println(n1 ^ n2);
+ 是取一个数本身
- 取相反数
/ 如果是两个整数相除, 结果会直接丢弃小数部分, 有可能会丢失精度.
% 取余
-
如果n % m == 0 说明n能被m整除.
-
如果n % 2 == 0 说明n是偶数, 如果n % 2 != 0, 说明n是奇数
-
N % M 的结果总是小于M, 让一个完全未知的数落在一个已知的M范围内.
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。
++n 前加加, 先加后用, 不需要临时空间 效率高
n++ 后加加, 先用后加, 需要一个临时空间保存老值(也就是用的值), 效率低
int n = 10; n += 30;
效果相当于 n = n + 30, 但是不会引起数据类型的变化, 更安全.
比较运算的结果总是boolean
比较大小的运算只适用于基本数据类型中的数值型
==, != 可以适用于任意数据类型.
在Java中不可以写成3 < x < 6. 为什么? 因为 3 < x结果是boolean, 让boolean再和6比大小出问题.
逻辑运算符 只适用于布尔之间.
逻辑与 : 只要有假就是假
& 和 && 的区别 就是双& 有短路效果. 在实际使用中必须使用这个.
逻辑或 : 只要有真就是真
| 和 || 的区别 双|| 有短路效果, 在实际使用必须使用这个.
变量 = (布尔表达式) ? 表达式1 : 表达式2; //表达式1和表达2的值类型要一致.
运算符优先级, 先记住最高的.() 最低的赋值和累操作
结合性 由高到低
. () {} ; , | |
---|---|
R—>L | ++ -- ~ !(data type) |
L—>R | * / % |
L—>R | + - |
L—>R | << >> >>> |
L—>R | < > <= >= instanceof |
L—>R | == != |
L—>R | & |
L—>R | ^ |
L—>R | | |
L—>R | && |
L—>R | || |
R—>L | ? : |
R—>L | = *= /= %= |
+= -= <<= >>= | |
>>>= &= ^= |= |
流程控制
l 顺序结构
- 程序从上到下逐行地执行,中间没有任何判断和跳转。
l 分支结构
-
根据条件,选择性地执行某段代码。
-
有if…else和switch两种分支语句。
If
// if (条件布尔) {
//语句块; 如果条件布尔为真时此语句块就执行.
//}
if (n == 5) {
System.out.println("n == 5"); // 有条件执行语句
}
If else
If else if else if…
switch
l 循环结构
Ø 根据循环条件,重复性的执行某段代码。
Ø 有while、do…while、for三种循环语句。
每日一考_day04
1. 变量分类有两种分法, 第一种是按数据类型来分,另外一种是按照声明位置来分, 每一种又各分为哪些种类型. 各有什么特点?
变量分类 :
-
按照数据类型来分
-
基本数据类型 : 内存区域中保存的是数据本身
-
数值型
-
整数
a) byte
b) short
c) int
d) long
e) char
-
浮点数
-
float
-
double
只有数值型之间可以强制互相转换, 只有数值型之间可以比大小.
在赋值时 :
如果右侧的量值范围大于左侧的变量类型的范围, 必须强制类型转换(强转有风险)
如果右侧的量值范围小于左侧的变量类型的范围, 可以直接自动完成.
double > float > long > int > short > byte
> char
3)布尔型 boolean : true, false
- 引用数据类型 : 内存区域中保存的是对象地址 : 对象在内存中的某个字节的编号. 本质上是一个正整数, 所有的引用变量都8字节(64位JDK)
String s = “abc”;
-
按照声明位置来分
-
局部变量 范围小, 寿命短.
声明在方法中的变量
- 成员变量 范围大, 寿命长
声明在类中方法外的变量
2. 计算下列结果, 分析过程, 只需要计算到十六进制形式即可.
int a = 0x6B;
int b = 0x5D;
// 0110 1011 &
// 0101 1101 =
// 0100 1001 => 0x49
System.out.println(a & b);
// 0110 1011 |
// 0101 1101 =
// 0111 1111 => 0x7F
System.out.println(a | b);
// 0110 1011 ^
// 0101 1101 =
// 0011 0110 => 0x36
System.out.println(a ^ b);
3. 运算符%的作用是什么? 有什么实际的应用?
1) n % m 如果结果是0, 说明n能被m整除, 如果结果不为0, 说明n不能被m整除
2) n % 2 如果结果是0, 说明n是偶数, 如果结果是非0, 说明n是奇数
3) n % m 结果总是0~m-1,
判断一个数是否是奇数
If (n & 0x01 == 1) {
说明它一定是奇数
}
4. 判断:
1) if else if else if else 语句中, 如果同时有多个条件都为true, 那么将会有多个语句块被执行, 错误, 因为if else 是绝对的分支, 多语句块之间互斥
2) switch case case default 语句中, 如果同时有多个条件都为true, 那么将会有多个语句块被执行
如果是switch, case, case之间绝对不允许相同
Switch(n) {
Case 1 :
Case 2 :
Case 1 : // 此行直接报错, 因为case不允许重复
}
5. 在switch结构中, switch()括号中的要求具体是什么? case后面的要求又是什么?
Switch()中的要求是必须是变量或表达式, 数据类型是非long整数.字符串,枚举.
Case 后面要求必须是常量, 包括字面量和final修饰的量. 不允许表达式和变量
switch (n * 2 / 5) {
}
每日一考_day05
1. 列出变量的使用注意事项(至少6点)(尝试解释一下原因)
1) 必须要有数据类型和变量名
2) 先声明, 后使用
3) 变量有其作用范围
4) 变量有其数据范围
5) 变量必须初始化值才能读取.
6) 同一范围内变量不允许重复声明.
2. 变量分类有两种分法, 第一种是按数据类型来分,另外一种是按照声明位置来分, 每一种又各分为哪些种类型. 各有什么特点?
分类 :
-
按照数据类型来分 :
-
基本数据类型 : 内存区域中保存的是数据本身
-
数值型 : 可以互相转换, 可以互相比大小
-
整数 : byte, short, int, char, long
-
浮点数 : float, double
-
布尔型 : 都不行, 只允许两个常量值, true, false
-
引用数据类型 : 内存区域中保存的是对象地址, 本质上就是内存的某个字节的编号.
-
按照声明位置来分 :
-
局部变量 : 声明在方法中
范围小, 寿命短
- 成员变量 : 声明在类中方法外
范围大, 寿命长
3. for循环的结构是什么? 执行流程是如何?
for (初始语句A; 条件语句B; 迭代语句C) { // 和while很像
循环体语句D;
}
A B D C B D C B D C B D …… B
迭代语句C 是每次循环的开始语句
写程序, 打印一个倒直角三角形.
int n = ?;
for (int i = 0; i < n; i++) {
for (int j = 0; j < -i + n; j++) {
System.out.print(“*”);
}
System.out.println();
}
循环总结 :
循环 : 在某些条件满足的情况下, 反复执行特定的代码的功能.
循环的组成 :
-
初始化语句 : 作准备工作, 通常是int i = 0;
-
循环条件 : 控制循环的生死, 如果条件为真就一直循环, 直接条件为假. i < n
-
循环体 : 被多次执行的语句
-
迭代语句 : 让i向n靠近, 每次i++, 使用循环趋于结束, 如果没有迭代, 循环不能自然结束
while : 适用于循环次数不确定的循环, 结束取决于外部条件
while (布尔条件) { // 如果布尔条件为假, 循环次数是0~N次
循环体; 在循环中控制布尔
}
do while : 适用于循环次数不确定的循环
do { // 如果布尔条件为假, 至少也要循环1次. 循环次数是1~N次.
循环体; 在循环体中控制布尔
} while (布尔条件);
for : 适用于循环次数确定的循环
for (初始语句int i = 0; 循环条件 i < n; 迭代语句i++) {
//循环体;
}
方法
方法 : java程序中某个功能的封装, 一个独立的功能体. 也称为函数
方法声明 :
修饰符 返回值类型 方法名(数据类型1 形式参数1, 数据类型2 形式参数2, ....) {
语句, 方法体
return 返回值;
}
返回值类型 : 方法的功能的最终体现 , 成果是什么, 数据类型是什么.
方法名 : 标识方法的.
形式参数 : 形式上需要的数据, 但是实际数据是多少不影响功能, 没有这个数据也不行. 在功能的完成时需要的数据
return 返回值, 最终的功能的结果数据要返回给调用者
调用者 : 使用这个方法的角色. 方法在调用时必须要由调用者传递实际参数.
方法 = 方法签名 + 方法体(body)
方法签名 : 方法的使用说明书. API
方法体 : 实际执行的代码.
注意 : 方法不可以嵌套, 必须是并行的.
方法调用(method invoke) : 是一个语句
方法名(实参列表); // 实参列表必须完全遵照形参的要求来写. 类型和个数及顺序要完全匹配.
方法的返回值? 方法调用本身
方法的返回值的接收只有一次机会, 错过了, 就错过了....
如果方法没有返回值, 必须使用void作为返回值类型
如果方法不需要参数, 参数列表空着, 但是()必须要有
l 注 意:
Ø 没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。
Ø 定义方法时,方法的结果应该返回给调用者,交由调用者处理。
Ø 方法中只能调用方法,不可以在方法内部定义方法。
Ø 方法的返回值只有一次机会接收, 就是在调用时
Ø 如果在方法中又调用了方法本身, 称为递归调用
每日一考_day06
1. 写出while循环和do while循环的区别, 三个循环分别在什么场景下使用?
While至少执行0次
Do while 至少执行1次
While和dowhile 适用于循环次数不确定的循环
For循环适用于循环次数确定的循环.
2. 简述break语句和continue语句的作用.
break 中断某个语句块的执行
public class BreakTest { public static void main(String[] args) { boolean flag = true; l1 : { System.out.println("hello"); if (flag) { break l1; } System.out.println("world"); // 它不执行 } System.out.println("three"); } }
continue 中断循环的某次循环, 进入下一次.
3. 声明定义一个方法的语法格式是什么? 解释每部分的作用.
修饰符 返回值类型 方法名(形参列表) {
方法体;
return 返回值;
}
方法 = 方法签名(方法的使用说明书) + 方法体(真正执行的)
修饰符 : 修饰public, private 访问控制修饰符, static 静态, synchronized, abstract, final….
返回值类型 : 方法执行完毕后的结果数据的类型 ( 输出 ), 返回值只能返回一个.
方法名 : 标识符
形参列表 : 形式参数, 形式上的数据, 虽然没有值, 在方法体中可以直接使用. 在方法调用时 会由调用者传入实际的值. 此方法如果需要外部传入的数据, 就可以使用参数.( 输入 )
方法体 : 由一个个的语句构成, 是将来在方法时真正的执行部分.
返回值 : 方法在结束后, 产生的结果值, 值必须被返回值类型兼容.
4. 方法的返回值是什么? 如何使用这个返回值?
方法调用本身 :
变量 = 方法名(实参列表);
5. 什么是方法重载, 为什么要方法重载?
同一个类中, 方法名相同, 参数不同. 参数不同体现在类型不同, 个数不同, 顺序不同.
功能相近的一组方法, 便于使用者记忆. 调用简单.
注意点 :
1)方法在调用时实参是通过值传递给形参数据, 本质上就是一个赋值操作. 值传递更安全
2)方法永远无法修改另一个方法的局部变量.