Java第二课_变量和运算

发布时间 2023-12-05 00:30:34作者: 张心野

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);