数据类型与变量(二)

目录

1.类型转换

1.1 自动类型转换(隐式)

1.2 强制类型转换(显式)

2.类型提升

2.1 int与long

2.2 byte与byte

3.字符串类型(使用String类定义)


1.类型转换

类型转换分类简介优点缺点
自动类型转换(隐式)即代码不需要经过任何处理,在代码编译时,编译器会自动进行处理数据范围小的转为数据范围大的时会自动进行
强制类型转换(显式)即当进行操作时,代码需要经过一定的格式处理,不能自动完成数据范围大的到数据范围小的

①不一定能成功

②可能会造成精度丢失

1.1 自动类型转换(隐式)

代码1-1:

public static void main(String[] args) {
      int a = 6;
      long b = 66L;
      b=a;//6  a的范围小于b,编译器会自动将a提升为long类型,然后赋值
      a=b;
      System.out.println(a);
   }

e598bea9b0bb43b7a5aa900a61174b0e.png

由运行结果可以看出,当b的值赋给a时,编译报错,这是因为long的范围大于int,会有数据丢失,不安全。

当然由此我们也可以看出Java中不同类型之间的变量相互赋值的时候,会有严格的校验。

代码1-2:

public static void main(String[] args) {
        //byte a1 = 66;//66 编译通过,66在byte的范围内,编译器会将66转换为byte
        byte a2 = 666;
        System.out.println(a2);
    }

fa3f397bb6584e138ff241b0ed40e108.png

看运行结果,编译失败,因为666默认为int,超过了byte的范围,有数据丢失。

1.2 强制类型转换(显式)

代码1-3:

public static void main(String[] args) {
        float a = 1.1F;
        double b = 100.1;
        a = (float)b;
        System.out.println(a);
    }

 当double->float时,数据范围由大到小,要想编译成功,需要强制转换。

代码1-4:

public static void main(String[] args) {
        int d = 2;
        double m= 3.4;
        d = (int)m;
        System.out.println(d);
    }

运行结果如下:

b9e1fa6a643240d892a2e4f3e0a0f992.png

结果是3,这是因为int没有double表示的数据范围大,需要强转,小数点后全部丢弃。

代码1-5:

public static void main(String[] args) {
   byte b = (byte)128;
   System.out.println(b);
}

运行结果如下:

72912355235f4c44a06e3b6bf0f2fb65.png

128默认为int,超过byte范围,要想编译成功,需要显式转换。

那么为什么是-128呢?

让我们画个圆解释一下:

2fc6b6c8dbcc406685c6643f819f08be.jpeg

 byte类型的最大值为127,当超过这个最大值时,就会到-128这个值(数值会按照这个圆的顺时针方向增减。)

代码1-6:

 public static void main(String[] args) {
        boolean flag = true;
        int a = 2;
        a = flag;
        System.out.println(a);
    }

运行结果如下:

519f48775c80411ba9a8cb145e2a522a.png

编译失败,类型不兼容

注:

①将一个字面值常量进行赋值时,Java会自动针对数字范围进行检查。

②不相干的类型不能互相转换。

2.类型提升

不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。

2.1 int与long

int会被提升为long

代码2-1:

public static void main(String[] args) {
        int a = 10;
        long b = 100L;
        long c = a+b; //编译成功,a+b=int+long-->long+long
        int d = a+b;
        System.out.println(d);
    }

运行结果如下:

29ba2b4e5bf24889affbc17bcc694386.png

int c = a + b = int + long = long + long

此时的结果是long类型,赋值给int时会丢失数据。

2.2 byte与byte

代码2-2:

 public static void main(String[] args) {
        byte a = 1;
        byte b = 2;
        byte c = a+b;
        System.out.println(c);
    }

运行结果如下:

3a272f8b531f44c4884f50494d04cc24.png

为什么byte和byte相同类型,却出现编译报错呢?

这是因为a+b在运算时会将a+b都提升为int再进行计算,即 int + int = int,此时的结果为int型,赋值给byte型,当然就报错了。

那么下面看正确写法:

代码2-3:

public static void main(String[] args) {
        byte a = 2;
        byte b = 3;
        byte c = (byte)(a+b);
        System.out.println(c);
    }

小结:

①不同类型的数据混合运算,范围小的会提升成范围大的。

②对于short,byte这种比4个字节小的类型,会先提升成四个字节的int,再运算。

3.字符串类型(使用String类定义)

代码3-1:

public static void main(String[] args) {
        String s1 = "hahaha";
        String s2 = "lalala";
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s1+s2);//s1+s2表示将s1和s2拼接
    }

 运行结果如下:

1151db04223c4ab0b2a13b834b06f868.png

在一些情况下,需要将字符串和整形数字之间进行转换:

①int转换为String

代码3-2:

public static void main(String[] args) {
        int a = 10;
        String s1 = String.valueOf(a);
        System.out.println(s1);
        String s2 = a+"";//当字符串和其他类型进行相加的时候,结果就是字符串
        System.out.println(s2);
    }

运行结果如下:

9e49f535c65e457c86e31a583578fe1c.png

 ②String转换成int

代码3-3:

public static void main(String[] args) {
   String str3 = "123";
   int ret = Integer.parseInt(str3);
   System.out.println(ret);
}

运行结果如下:

33d14dd8d9a14680811c546bc0f0c0c3.png

看下面这个代码:(考虑运算顺序)

代码3-4:

public static void main(String[] args) {
   int c = 20;
   int d = 7;
   System.out.println("c = "+c +", d = "+d);
   System.out.println(c+d +" hello");//27 hello
   System.out.println("hello"+c+d);//hello207
   System.out.println("hello"+(c+d));//hello27

}

运行结果如下:

2eee1c96477442c6a8eb27902ac9fa5d.png

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值