第三章 操作符
变量
-
变量使用:如果只声明变量,没有赋值,那么在使用的时候会报错。
-
成员变量 即使声明完,不赋值,它也是有一个默认的值;局部变量没有默认值。
-
方法的参数,也是局部变量,它的作用范围在整个方法中。
操作符 !!
-
a++ : 先使用 a 的值,输出结束,再进行 + 1
-
比较操作符 :instanceof ,判断对象是否属于指定类型
( o instanceof Student )
本质:当前引用 o 指向的对象类型与Student的关系。(子父类型,父子类型,有无关系)
-
“ **== **” ,可以用在俩个数字之间的判断,也可以用俩个对象之间的判断。
-
byte + byte = int ; byte + int = int; 【类型提升】
- byte 、short类型相加减 ,结果都会转换为int类型。
- 当加数为long类型,和为long类型。其他整型类型,和为int类型。
- 当加数为浮点数类型,和为浮点数类型。当加数为double类型,和为double类型。
-
位运算,以补码的形式操作。
位运算符 作用 巧记 & 与运算 全1才为1 | 或运算 全0才为0 ^ 异或运算 相同为0,不同为1 ~ 取反运算 -
逻辑运算符 && 、 || :
- 逻辑与 &&,第一个条件为false, 发生短路。
- 逻辑或 || , 第一个为true时,发生短路。
-
& 和 && 有什么区别?
- &既可以作为二进制数字的位运算符,也可以作为布尔表达式中的逻辑运算符,但是作为逻辑运算符的时候,&并没有&&符合的那种短路的功能。
- && 只能作为逻辑运算符,但是它会具备短路的功能。
-
研究位运算,使用补码。
-
移位操作符
- >> 算术右移位运算
注意,这个操作的本质就是除以2的n次方,这个n就是我们右移的位数。
注意,除以2的n次方之后,只保留整数部分
注意,正数右移之后,最左边空出的位置,都要补0
注意,负数右移之后,最左边空出的位置,都要补1
例如,16 >> 3 结果是2 ,相当于 16 / 2的3次方 = 2 - << 左移位运算
注意,这个操作的本质就是乘以2的n次方,这个n就是我们左移的位数
注意,无论正数负数左移之后,最右边空出的位置,都要补0
注意,当左移之后,得到的数字已经超出当前类型所能表示的最大值的时候,这个值最终会被限定到这个当前类型中,所以最终显示的值会和我们逻辑上算出的值有所不同。
例如:直接使用2进制表示数字
int a = 0b01000000000000000000000000000000;
int result = a<<2; //其实这个结果已经超出了int能表示的最大值
System.out.println(result); //结果是0 - >>> 逻辑右移位运算,也叫做**【不带】符号的右移运算**
注意,这个操作的本质就是除以2的n次方,这个n就是我们右移的位数
注意,除以2n之后,只保留整数部分
注意,正数和负数右移之后,最左边空出的位置,都要补0
例如:
12>>>1 结果是 6
-12>>>1 结果是 2147483642
注意:在操作的时候,java操作的都是计算机中的补码
- >> 算术右移位运算
-
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模/取余。如果对int
型移动33位,实际上只移动了33%32=1位。如果对int型移动32位,实际上只移动了32%32=0位
类型转换
-
instanceof ,先进行逻辑判断(if o instanceof String ) ,就是为了防止类型转换的错误。
-
子类类型的变量,可以自动转为(隐式)父类类型
-
基本类型的自动转换的问题:
- char --> int :可以转换
- int --> float : 可能发生精度丢失的问题。
- long --> float、double:可能发生精度丢失的问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EPB187Ix-1629103732098)(C:\Users\asus\Desktop\我的笔记\思维导图-脑图-总结\7种类型转换.png)]
-
使用浮点数4则运算时,会产生精度丢失的问题。
- 通过 java.math.BigDecimal 类处理计算问题。
- add方法
- subtract方法
- multiply方法
- divide方法
流程控制
- 多个 if 语句,可以用return进行简化。
- if和else这俩个语句中的代码,【一定】是有唯一的一个执行,而另一个不执行。
- switch中,break表示当前逻辑的结束。
- 执行一次case后,没有break,然后代码会继续往下执行,并且不会再做case 1 2 3的判断了
- while 和 for 可以互换
- while :使用在 不确定的循环次数
- for :使用在 确定的循环次数
- do while : 定义循环的变量,放在循环体的外面。( 局部变量的使用 )
- 嵌套循环中,内层for循环受到外层for的影响。
break、continue、lable标签 !!
- continue :跳过本次循环 剩余的代码。
- break :终止包含它的循环。(两层循环的话,一层循环停止)
- return :直接结束方法的执行
快捷键
-
ctrl + n : 创建新文件
-
ctrl + shift + “+” : 放大
-
alt + / : 手动提示
-
/** + enter键 : 自动生成文档注释
-
sys + 提示 : 输出语句
sout + 提示 :输出语句
-
ctrl + / : 自动注释
-
ctrl + alt + 下键 : 复制多行
-
alt + 下键 : 移动代码
-
ctrl + shift + / : 多行注释
-
ctrl + 2 + l : new 对象 自动补全
ctrl + 1 + enter键 : new 对象 自动补全
-
删除一行代码 : ctrl + d ( 推荐Ctrl+x 剪贴板 )
-
ctrl + shift + t : 查看源码
-
ctrl + f :搜索
-
查看某个方法、类的实现 :ctrl + 单击鼠标
注意
-
静态方法中通过对象调用成员变量。
-
实例变量就是类中的属性,也叫做成员变量(非静态的)【成员变量=实例变量】
-
static是类级别方法 也就是可以 类名.方法调用 。
不加static是实例级别的 也就是必须 先有实例(对象)才能调用其方法如new A().test() -
为什么“静态方法不能调用类成员变量”,因为要想访问成员变量你必须有个“已经实例化好的对象”,除非你在静态方法里创建一个当前类的实例对象,否则你是无法直接调用成员变量的,因为它不知道这个成员变量属于哪个实例对象的。
-
-
“+” 在 字符串中做拼接,在 char中做计算。
-
数值也可以和字符串使用+号连接,也是拼接。
-
return 代表 方法结束。
-
学会加入return ,结束下面的语句、逻辑判断。
-
移位操作,对位进行操作,是直接对内存进行操作。
(程序进行,二分之一运算时,采用位运算更快。)
-
Random类在 java.util.Random 包中。
-
java.lang.Math.random() : 静态方法
- 范围: [ 0 , 1 )
- (int)Math.random() * 10 : 对随机数取整了!
- 注意加括号 (int)(Math.random() * 10)
- 某个区间范围4~6 :4 + (int)( Math.random() * 3 )
细节
- 引用类型,默认值是null
- 可输入的参数、不确定的值,可以放在方法括号当中。 public void method(int num){}
- 变量 :会变的量。
- 实例变量的作用范围是当前类中所有的 非静态 方法,都可以访问。
- 静态方法通过类名调用。【编程规范】
- java中的=号赋值操作,需要**=号俩边的类型一致**,也就是=号右边的数据的类型要和=号左边的变量的类型保持一致,如果不一致,那么就需要做类型的转换,分为隐式转换和显示转换。
- “ - ”号只针对基本数据类型。
- 控制台打印出的都是字符串类型。
- if 、for 共同点 :重复执行,破坏了程序的顺序执行。
- 死循环,缺少条件判断。
- 循环,图案的输出,重点关注i++,j-- 。(逐渐增多还是逐渐减少)
查漏补缺 !!
-
System.out.println( ‘a’ + 1 ); // 98 作为int类型来计算
System.out.println( ‘a’ + ‘1’ ); // 146
char z = ‘a’ + 1 ; // b
-
“+” 在 字符串中做拼接,在 char中做计算。
-
数值也可以和字符串使用+号连接
-
System.out.println( “a” + “b” + 1 + 2); // ab12
System.out.println( 1 + 2 + “a” + “b” ); // 3ab
-
System.out.println( true & false ); //false
System.out.println( true && false ); //false 【短路与**&&**,第一个为false时,短路】
-
三目类型中基本类型转换:
-
System.out.println(true ? 97 : ‘a’);//a
-
System.out.println(true ? 97 : 1.0);//97.0
-
System.out.println(false ? 97 : ‘a’);//a
-
System.out.println(false ? 1.0 : ‘a’);//97.0
-
System.out.println(false ? 1.0 : 100);//100.0
-
int a = 97;
-
char c = ‘a’;
-
double d = 1.0;
System.out.println(true ? a : c);//97
-
-
三目运算,
- int 和 double时,输出double。
- char 和 double时,输出double。
- int 和 char 直接在输出语句中做判断时,输出char类型。
- int 和 char通过变量判断时,输出int类型。
- System.out.println(true ? 97 : ‘a’);//a
System.out.println(false ? 97 : ‘a’);//a
int a2 = 97;
char c2 = ‘a’;
System.out.println(true ? a2 : c2);//97
System.out.println(false ? a2 : c2);//97
System.out.println(true ? c2 : a2);//97
System.out.println(false ? c2 : a2);//97
- System.out.println(true ? 97 : ‘a’);//a
作业-查漏补缺
- 负数,先原码变成补码,再左移,看符号位是正、负数,再看是否求原码
- 打印图案时,观察递增递减,根据图案寻找数学公式、规律,进行替换。
问题、拓展
-
三目运算符中关于数据类型转换。
-
多个 if 语句,可以用return进行简化。
public String method4(int num) { if(num >0) { return "num >0"; } //不会执行剩余代码 if(num <0) { return "num <0"; } return "num = 0"; }
-
switch 比 if 执行效率高 考虑研究
-
if能处理所有的boolean类型的结果值,switch只能处理byte、short、int、char、String等5种类型的数值比较。
-
switch只能是在常量选择分支时比if…else效率高,但是if…else能应用于更多的场合,if…else比较灵活。
-
if …else走逻辑判断时,每条if语句都独立需要加载,都要走一遍判断。switch…case 根据一个值进行多路分支,只做一次计算。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XoMiqYqG-1629103732106)(C:\Users\asus\Desktop\我的笔记\思维导图-脑图-总结\if-switch对比.png)]
-
-
位移表示int 最大值:1 << 31(最小值) , -1 >>> 1(最大值)
- -1 二进制表示 全为1 。 1111 1111
- 二进制的 0000 0000 0000 0000 0000 0000 0000 0000 到 0111 1111 1111 1111 1111 1111 1111 1111 是正数
- 1000 0000 0000 0000 0000 0000 0000 0000 到 1111 1111 1111 1111 1111 1111 1111 1111 是负数
重点!!!
-
Math.random()的使用
while(num != 5) { 【后面乘法要加括号!!!】 num = (int)(Math.random()*10); }