zoukankan      html  css  js  c++  java
  • 跟着刚哥梳理java知识点——变量之间的类型转换(四)

    变量之间的类型转换主要包括自动类型转换强制类型转换

    1、自动类型转换:当容量小的数据类型与容量大的数据类型做运算时,容量小的会自动的转换成容量大的类型。

      【知识点】:

        a)char,byte,short ---> int ---> long ---> float ---> double ---> String

      char c = 'a';
      short s = 12;
      byte b = 125;   //char、short和byte之间运算全部自动转换成int   int s1 = c + s;   int s2 = b + s;   int s3 = c + b;   long l = 1000L;   //int和long之间的运算自动转换成long   long l1 = s1 + l;   float f = 12.36f;   //long和float之间的运算自动转换成float   float f1 = l1 + f;   double d = 16952;   //float和double之间的运算自动转换成double   double d1 = f1 + d;

      b)那是不是有人反思过这样的问题。

        short a = 3;   //编译正常

        a = a + 3;  //编译错误

        a += 3;     //编译正确(原因参照强制类型转换)

        3也是默认类型int类型,为什么直接赋值给a没事,而a+3自动转换成也是int类型的,再赋值就编译错误了呢?

        问题关键点在3是常量,这种赋值操作只有后面是变量的情况下才会发生编译错误。所以我们的标题叫做变量之间的类型转换。

      int a = 1;
      int b = 2;
      byte b1 = 1 + 2;//编译正确
      byte b2 = a + b;//编译错误(cannot convert from int to byte)

        那么常量运算也总结一下:

      byte b1 = 1 + 126;  //编译正确
      byte b2 = 1 + 127;  //编译错误(cannot convert from int to byte)
      int a = 1 + 1.2;    //编译错误(cannot convert from double to int)
      String s2 = 12 + "";//编译正确

        (1)127在byte的范围中,编译正常,而128超过了byte的范围,编译错误。

        (2)1 + 1.2 = 2.2,2.2是double类型,超过了int的范围,编译错误。

        (3)12 + " " = "12"(int + String = String),谁和String做运算都被自动转换成String。

         总结:做常量运算,看结果的数值范围。不能单纯的看类型范围。

      c)笔试题: 

        (1)考核各个数据类型之间的连接操作理解程度

      String a = "abc";
      char c = 'a';//a的ASCII码是97
      int i = 12;
      System.out.println(a+c+i);//abca12
      System.out.println(c+i+a);//109abc
      System.out.println(a+i+c);//abc12a

        (2) 考核对计算机变量存储的灵活应用

          int a = 200;

          int b = 500;

          在不申明第三方变量的情况下,如何对a和b的值进行互换?

          a = a + b;

          b = a - b;

          a = a - b;

          这样就完成了a和b的值互换,但是我们思考一下,其实是不严谨的。

          我们设想一下,如果a和b是一个很大的值,两个相加有可能超过了int的数值范围,那么有什么更好的办法吗?

          答案是肯定的,看下一篇文章《运算符》中的异或,那里给出了最完美的答案。

    2、强制类型转换:当容量大转换成容量小的,需要使用强制类型转换。用形式:(类型) 来做强制转换。

      【知识点】:

        a)强制类型转换的问题:导致精度的丢失

      int i = 128;
      byte by = (byte)i;
      System.out.println(by);

        输出结果:-128

        b)+=,-=,*= 这类的运算符运算是自动被强制类型转换的。

          例如上面的案例: a += 3; 其实等价于 short a = (short)(a+3);所以肯定不会编译错误。

        c)int类型不能强制类型转换成String

          int a = 100;
          String str = (String)a;//编译错误(Cannot cast from int to String)

        d)null值可以强制转换为任何java类类型

          笔试题:String str = (String)null和String str = null的区别

              两个是一样的,第一个可不是“null”字符串,它还是null。

        e)数值类型转换成字符串(有3种方法)

          int a = 33;
          String s1 = a + "";              //方法一:用+连接符和“”
          String s2 = Integer.toString(a); //方法二:Integer.toString
          String s3 = String.valueOf(a);   //方法三:String.valueOf(看String源码发现valueOf调用的是方法二)

        f)字符串转换成数值类型(有2种方法)

          String s = "33";
          int a1 = Integer.parseInt(s);//方法一:用该数值类型的包装类的parse方法
          int a2 = Integer.valueOf(s); //方法二:用该数值类型的包装类的valueOf方法
  • 相关阅读:
    C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数
    一个汇编小demo
    C语言与汇编的嵌入式编程:求100以内素数
    TCP网络调试助手上提示错误:“1035 未知错误”的有效解决方法,本人实测确实可行
    一个支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱
    DRM(device resource management)介绍
    TODO
    pinctrl(1)——pinctrl子系统的使用
    GPIO使用总结
    Gerrit使用技巧
  • 原文地址:https://www.cnblogs.com/hzg110/p/6536908.html
Copyright © 2011-2022 走看看