Java中的操作符
赋值和地址引用
两者的区别
package com.cloud.day4; public class Demo1 { public static void main(String[] args) { Fish f1 = new Fish(); Fish f2 = new Fish(); f1.count = 22; f2.count = 33; /*基本数据类型的赋值操作*/ f1.count = f2.count; f1.count = 55; System.out.println(f1.count); //55 System.out.println(f2.count); //33 /*引用类型的地址传递操作*/ f1 = f2; f1.count = 66; System.out.println(f1.count); //66 System.out.println(f2.count); //66 } } class Fish{ int count; } |
名称混调问题
package com.cloud.day4; public class Demo2 { static void getA(Level e1){ e1.a = 22; } public static void main(String[] args) { Level e2 = new Level(); e2.a = 33; System.out.println(e2.a); //33 getA(e2); System.out.println(e2.a); //22 } } class Level{ int a; } |
基本操作符
数值运算
package com.cloud.day4; public class Demo3 { public static void main(String[] args) { /*整数的除法会直接去掉小数部分*/ System.out.println(3/2); //1 System.out.println(10/3); //3 /*改变变量的正负*/ int x = 22; int y = 0; System.out.println(y = -x); //-22 System.out.println(y = (-x)*10); //-220 /*自增自减:在前先运算,在后后运算*/ int i = 1; System.out.println("i:"+ ++i); //2 System.out.println("i:"+ i--); //2 } } |
关系运算
package com.cloud.day4; public class Demo3 { public static void main(String[] args) { /*基本的变量之间的比较*/ int x = 2,y = 3; System.out.println(x = y); //3 System.out.println(x == y); //true System.out.println(x != y); //false /*对象之间的比较: '=='值和地址的引用都要相同*/ Integer i1 = new Integer(33); Integer i2 = new Integer(33); System.out.println(i1 == i2); //false System.out.println(i1 != i2); //true /*单纯的比较对象的值*/ System.out.println(i1.equals(i2)); //true /*equals的本质:不同的类覆盖的equals不同*/ Test t1 = new Test(); Test t2 = new Test(); t1.i = t2.i = 66; //没有覆盖equals方法 System.out.println(t1.equals(t2)); //false } } class Test{ int i; } |
条件中断
package com.cloud.day2; public class Demo1 { public static boolean test1(int t1){ System.out.println("test1"); return t1<1; } public static boolean test2(int t2){ System.out.println("test2"); return t2<2; } public static void main(String[] args) { /*test1、test2、&&*/ if(test1(0)&&test2(1)){ System.out.println("&&"); } /*test1、|| 这里的第二个条件就没有执行*/ if(test1(0)||test2(1)){ System.out.println("||"); } /*test1、test2、||*/ if(test1(2)||test2(1)){ System.out.println("||"); } } } |
位运算操作
基本概念
概念:就是逢二进一就是二进制,二进制只有两个数,0和1,简单易于电子方式的实现,
同时0和1的组合可以表示任意一个数
基础:
一个整形int占4个字节
每个字节占8位
一个汉字占两个字节
原码、反码、补码
1. 原码
用二进制表示一个数,这个码就是原码
1--à原码是 00000000 00000000 00000000 00000001 表示1*2的0次方就是1
00000000 00000000 00000000 00000101 表示1*2的0次方 + 0*0的1次方 +1*2的2次方 1+0+4=5 这个码就表示5
2. 反码
3. 补码
A. 二进制的最高位是符号位,1表示负数,0表示正数
B. 正数的原码,反码,补码都是一样的
C. 负数的反码=他原码的符号位不变,其余取反,1变0,0变1
-1原码 10000000 00000000 00000000000000001 开头的1表示负数
-1反码 11111111 11111111 11111111111111110
-1补码 11111111 11111111 11111111111111111
D. 负数的补码=它反码 +1
E. 0的反码,补码都是0
F. 在计算运算的时候都是以补码的方式运算的
位运算规则
案例:
1. ~2=??
步骤:
计算机预算补码
整数原码,补码,反码都是一样的
2的原码
00000000 00000000 00000000 00000010
~2,按位取反:
11111111 11111111 11111111 11111101 负数
推出反码(补码—1)
11111111 11111111 11111111 11111100
推出其原码(符号位不变)
10000000 00000000 00000000 00000011
结果就是 —3
2. ~-5=??
步骤:
-5原码:
10000000 00000000 00000000 00000101
-5反码:
11111111 11111111 11111111 11111010
-5补码:
11111111 11111111 11111111 11111011
~-5取反:
00000000 00000000 00000000 00000100 是正数,原码,反码,补码一样
结果是:4
3. 2&3,两个都是1才是1
步骤:
2的补码:00000000 00000000 00000000 00000010
3的补码:00000000 00000000 00000000 00000011
2&3: 00000000 00000000 00000000 00000010 补码运算,还是补码
结果:2
4. 2|3,一个为1就是1
步骤:
2的补码:00000000 00000000 00000000 00000010
3的补码:00000000 00000000 00000000 00000011
2|3: 00000000 00000000 00000000 00000011
结果:3
5. 2^3,一个是0,一个是1,结果才是1
步骤:
2的补码:00000000 00000000 00000000 00000010
3的补码:00000000 00000000 00000000 00000011
2^3: 00000000 00000000 00000000 00000001
结果:1
移位运算
类型: <<(左移) >>(右移)
运算规则:
算术右移:低位溢出,符号位不变,并用符号位补溢出的高位
案例: 1>>2
1的补码:00000000 00000000 00000000 00000001
1>>2 00000000 00000000 00000000 00000000
结果:0
算术左移:符号位不变,低位补0
案例:
1<<2
1的补码:
00000000 00000000 00000000 000000001
向左移动:
00000000 00000000 00000000 000000100
结果:4
三元操作符
package com.cloud.day2; public class Demo2 { static int test(int i){ if(i>5){ return i-5; }else{ return i+5; } } public static void main(String[] args) { int result = test(6); System.out.println(result); } } |
操作符的错误使用
逻辑判断和赋值
int x=2,y=2; if(x=y){} while(x=y){} |
类型转换
package com.cloud.day2; public class Demo2 { public static void main(String[] args) { int x=2,y=2; long lg = x; System.out.println("自动类型转换:"+lg); y = (int) lg; System.out.println("强制类型转换:"+y); } } |