Java类型转换

隐式类型转换

隐式类型转换支持字节数小的类型自动转换为字节数大的类型,整数类型自动转换为小数类型:

  • byte ——> short(char) ——> int ——> long ——> float ——> double

    public static void main(String[] args) {
      byte b = 9;
      short s = b;
      int i = s;
      long l = i;
      float f = l;
      double d = f;
      System.out.println(d);
    }
    //输出 9.0
  • 问:为什么long比float大,还能转换为float呢?
  • 答:小数的存储规则(阶码)让float的最大值比long还大,但可能丢失某些位上的精度。

    显式类型转换

    显示类型转换(强制类型转换),不符合隐式转换的规则,牺牲精度强行进行类型转换。

public static void main(String[] args) {
    int i = 128;
    byte b = (byte)i;
    System.out.println(b);
}
//输出 -128
  • int 128:00000000 00000000 00000000 10000000
  • byte:xxxxxxxx xxxxxxxx xxxxxxxx 10000000 => -128
  • byte第一位是符号位:1-正 0-负

    数据类型自动提升

    在参与运算或位于表达式中(除自增自减)时,所有的byteshortchar的值将被提升到int型:

    public static void main(String[] args) {
      byte b = 105;
      b = b + 1;    //报错
    System.out.println(b);
    }
    //报错:不兼容的类型: 从int转换到byte可能会有损失

    这个是由Java虚拟机规范定义的,可以使用强制类型转换:

    public static void main(String[] args) {
      byte b = 105;
      b = (byte) (b + 1);
      System.out.println(b);
    }
    //输出 106

    运算符

    赋值和算术运算符

    赋值运算符

    =(赋值运算符)是最常用的运算符,将等号右边的结果,传递给等号左边的变量:

    public static void main(String[] args) {
      int a = 1;
      System.out.println(a);
    }
    //输出 1

    算术运算符

    加减乘除取余

    + - * / %,分别代表加、减、乘、除和取余:

    public static void main(String[] args) {
      int a = 1;
      int b = a + 2;
      int c = b - 1;
      int d = c * 4;
      int e = d / 5;
      int f = d % 6;
      System.out.println(a);
      System.out.println(b);
      System.out.println(c);
      System.out.println(d);
      System.out.println(e);
      System.out.println(f);
    }
    //输出:
    //1
    //3
    //2
    //8
    //1
    //2
  • +还可以用作字符串连接符:

    public static void main(String[] args) {
      String a = "字符串";
      String b = "连接符";
      String c = a + b;
      System.out.println(c);
    }
    //输出:字符串连接符
  • 字符串可以直接连接其他类型,但是会全部当做字符串处理:

    public static void main(String[] args) {
      int a = 1, b = 2;
      System.out.println("字符串" + a + b);
    }
    //输出:字符串12

    自增和自减

    ++ --,代表自增和自减,即自身+1-1

    int a = 10;
    int b = 3;
    a++;
    b--;
    System.out.println(a); 
    System.out.println(b); 
    //输出:
    //11
    //2
  • 自增自减运算符放在变量前后的结果不同:

    //`a++` 先返回值,再自增
    int a = 10;
    System.out.println(a++);
    System.out.println(a);
    //输出:
    //10
    //11
    
    //`++a` 先自增,再返回值
    int a = 10;
    System.out.println(++a);
    System.out.println(a);
    //输出:
    //11
    //11

    扩展的赋值运算符

    += -= *= /= %=,和自增自减类似,先执行运算,再返回结果,同时自身改变:

    int a = 11;
    System.out.println(a += 2);//等价于 a = a + 2
    System.out.println(a -= 2);//等价于 a = a - 2  
    System.out.println(a *= 2);//等价于 a = a * 2  
    System.out.println(a /= 2);//等价于 a = a / 2  
    System.out.println(a %= 2);//等价于 a = a % 2
    System.out.println(a);  
    //输出:
    //13
    //11
    //22
    //11
    //1
    //1

    关系运算符

    >大于、 <小于、 ==等于、 >=大于等于、 <=小于等于、 !=不等于

  • 关系运算符的结果只能是布尔类型,要么为真(true)要么为假(false):

    int a = 1;
    int b = 2;
    boolean x = a > b;
    System.out.println(x);
    //输出:true

    逻辑运算符

    && 与运算,两边同时为true才能返回true
    || 或运算,两边至少要有一个为true才能返回true
    ! 非运算,一般放在表达式最前面,表达式用括号扩起来,表示对表达式的结果进行反转

    int a = 1;
    int b = 2;
    boolean x = a > b && a < b;
    System.out.println(x);   
    //输出:false
    int a = 1;
    int b = 2;
    boolean x = a > b || a <= b;
    System.out.println(x);
    //输出:true
    int a = 1;
    int b = 2;
    boolean x = !(a > b);
    System.out.println(x); 
    //输出:false

    位运算符

    位运算是根据值的二进制编码来计算结果(只有同时为1对应位才得1),返回的是运算后的同类型值,不是boolean值
    & 按位与
    | 按位或
    ^ 按位异或
    ~ 按位非

  • 按位与,以4bit为例:

    • 0101 & 0100 = 0100
    int a = 7, b = 15;
    int c = a & b;
    System.out.println(a & b); 
    //输出:7

    三目运算符

    可以根据条件是否满足来决定返回值:

  • 判断条件 ? 满足的返回值 : 不满足的返回值

    • 判断条件只能是boolean,或返回boolean的表达式
    int a = 1, b = 2; 
    System.out.println(a > b ? "对" : "不对";);  
    //输出:不对
最后修改:2023 年 02 月 08 日
如果想要赞赏,我绝不阻拦