1.变量
-
声明和初始化
int i;
int j, k;//只声明,局部变量只做声明后是不能访问的,必须初始化后才能访问
int x = 10;
int q = 20, w = 30;//j=30,k=40;错误
i = 40;// 初始化
i = 50;// 修改
- 基本数据类型
```java
//数值型从小到大依次为 : byte char short int long float double
byte b = 2;
char c = 'A';//char型可以参与数值运算
short s = 3;
int i = 10;
long a = 5555555555555555L;//整数默认为 int型,过长需手动加L
float f = 3.1544F;//小数默认为 double 型,赋值给float型需手动加F
System.out.println(f);
double d = 4.2;
//还有布尔型和字符串
boolean b1 = true;
String str = "sssssss";
-
进制
System.out.println(0B111);// 二进制/bin : 0 1 0B / 0b开头 System.out.println(055);// 八进制/OCT : 0~7 0开头 System.out.println(0xAB);// 十六进制/HEX : 0~9 a b c d e f 0x/0X 开头
-
类型转换
// 自动类型转换 : 小类型 ---> 大类型 byte b3 = -128;// 特例 : int数填入byte变量,使用频繁,默认是允许的 short s1 = 123;// 特例 : int数填入short变量,使用频繁,默认是允许的 s1 = b3;//小类型 ---> 大类型 int num = s1;//小类型 ---> 大类型 long a = num;//小类型 ---> 大类型 a = 123;//小类型 ---> 大类型 float f1 = 10;//小类型 ---> 大类型 // 强制类型转换 : 大类型 ---> 小类型 : 可能出现数据损失 : 精度损失,需要手动转换 double d = 6.55; float f = (float) d;//大类型的数值小,转化没有损失的情况也是有的 System.out.println("f = " + f); num = (int) f; System.out.println(num);//掉小数点后的数,符合正常数学认知 num = 256; b3 = (byte) num; System.out.println(b3);//这种直接丢失字节,导致转化后的结果不符合正常数学认知.这是因为计算机的底层是01字节. int i = 100, j = 200; short s2 = (short) (i + j);//直接让int变量填入short变量,不能自动转化的,需要手动转换 System.out.println("s2 = " + s2); s2 = 100 + 200;//这种依然可以自动转化 System.out.println("s2 = " + s2);
-
数学运算
int i = 23, j = 65; System.out.println("i + j = " + (i + j));// 遇到第一个字符串之后,+就是连接符 ,不再进行加法运算 System.out.println("i - j = " + (i - j)); System.out.println("i * j = " + i * j); System.out.println("i / j = " + i / j);//int除法,没有小数,只保留整数 注意 : 不是四舍五入 System.out.println("i / j = " + 1.0 * i / j);//想正常除,加个浮点数 double d1 = 2.3, d2 = 5.4; System.out.println("d1 / d2 = " + d1 / d2);//浮点数正常除 // % : 取模,就是取余数 ; 模的正负只与第一个数一致 System.out.println(15 % 7); System.out.println(15 % -9); System.out.println(-15 % 9); System.out.println(-15 % -9);
2.运算符
-
自加自减
// ++ : 自增 : 在原先基础上 + 1 // -- :自减,在原先基础上 - 1 int i = 10; ++i;//++i 先加再i,i+1再返回i值, i++;//i++ 先i再加,先返回一个i值,i再+1,再返回i值 System.out.println("i = " + i); //++i少一个步骤,执行效率高 int a = ++i;// ++i ; a = i; int b = i++;// b = i; ++i; System.out.println("a = " + a);// 13 System.out.println("b = " + b);// 13 System.out.println("i = " + i);// 14 //--和++同理
-
简写
// += 简写 int j = 10; j = j + 5;// j + 5 = 15 ; j = 15; System.out.println("j = " + j); j += 5;//j=j+5;// += 简写 System.out.println("j = " + j); // 简写会强制类型转换,不自觉地出问题 int a = 10; a += 10.5;// 强制转为变量本身类型 System.out.println("a = " + a); byte b =127; //b = (byte)(b+1); //System.out.println("b = " + b); b += 1;//本身byte和int运算完后会变int,但简写会强制转换,丢数值 System.out.println("b = " + b); // -=,*=,/=,%=同理
-
比较运算符
// 比较运算符 : 最终结果都是 boolean 类型值 // == 等于 1.用于基本数据类型比较的是值 2.用于引用数据类型比较的是地址值. // != 不等于 // > // >= 大于等于 // < // <= int i = 12, j = 89; System.out.println(i == j); System.out.println(i != j); System.out.println(i > j); System.out.println(i >= j); System.out.println(i < j); System.out.println(i <= j); String s1 = "abc", s2 = "abc"; System.out.println(s1 == s2);//2.用于引用数据类型比较的是地址值. // String类 可以直接使用 equals 函数进行内容的比较 System.out.println(s1.equals(s2));//比较的是实际内容
-
逻辑运算
// 逻辑运算 : 两边必须是boolean类型表达式 int x = 10; System.out.println(x > 5 & x < 15); // & : 且/与 : 两边同时为true结果为true,其余为false System.out.println(true & true); System.out.println(true & false); System.out.println(false & true); System.out.println(false & false); // | : 或 : 两边同时为 false 结果为 false ,其余为 true System.out.println(true | true); System.out.println(false | true); System.out.println(true | false); System.out.println(false | false); // ! : 非 , 取反面 System.out.println(!true); System.out.println(!false); System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); // && : 短路且 两边同时为true结果为true,其余为false int m = 10, n = 10; System.out.println(m > 100 & ++m < 1000);// false System.out.println("m = " + m);// 11 System.out.println(n > 100 && ++n < 1000);// false System.out.println("n = " + n);// 10 // || : 短路或 两边同时为 false 结果为 false ,其余为 true System.out.println(m > 0 | ++m < 1000); System.out.println(n > 0 || ++n < 1000); System.out.println("m = " + m);// 12 System.out.println("n = " + n);// 10 System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); // ^ : 同假异真 System.out.println(true ^ true); System.out.println(false ^ true); System.out.println(true ^ false); System.out.println(false ^ false); //正常来说&&和||,比&和|更常用. //因为&&和||一旦单看左边就能出结果,就不会再执行右边代码,可以节省步骤 // &和|多用于位运算
-
位运算
// 位运算 : 针对二进制进行的运算 // & : 对应位上同时为一结果为一 , 其余为0 // 11 : 0000 1011 // 6 : 0000 0110 // 结果: 0000 0010 System.out.println(11 & 6); // | : 有一位为一就为一,全0为0 // 11 : 0000 1011 // 6 : 0000 0110 // 结果: 0000 1111 System.out.println(11 | 6); // >> : 右移 , 第一位原先是什么就补什么,即正数还是正数,负数还是负数 // 右移一位相当于除以2 // 19 : |0001 0011| ---> |_0001 001|1 ---> |00001001| System.out.println(19 >> 1); System.out.println(333 >> 2);// 333 / 4 System.out.println(-333 >> 3);// -333 / 8 System.out.println(333 / 8); // << : 左移,同理 System.out.println(8 << 3); // >>> : 无符号右移 , 无论原先最高位是0还是1,通通补0 // 对正数没有影响,负数则会剧变 System.out.println(333 >>> 3); // 1111 1111 1111 1111 1111 1110 1011 0011 --> 0001111 1111 1111 1111 1111 1110 1011 0 System.out.println(-333 >>> 3); // ^ : 无进位相加 / 同0异1 // 11 : 0000 1011 // 6 : 0000 0110 // 结果: 0000 1101 System.out.println(11 ^ 6); // 适用于所有类型 int a = 10, b = 11; int temp = a; a = b; b = temp; System.out.println("a = " + a); System.out.println("b = " + b); // 一个数对另一个数异或两次,结果还是自己 System.out.println(9527 ^ 3306 ^ 3306); // 不借助第三个变量,交换两个变量的值 : 整型可用 a = a ^ b; b = a ^ b;// b = (a ^ b) ^ b a = a ^ b;// a = ( a ^ b) ^ ((a ^ b) ^ b) ; System.out.println("a = " + a); System.out.println("b = " + b);