Java各种数据类型,不同数据类型转化的详解

前言❤️❤️

hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹

这是这个栏目第二篇的学习博客,会详细介绍Java中的各种数据类型跟C语言中的区别,变量的创建,Java中的类的简单介绍,帮助大家快速入门💪
在这里插入图片描述
🎇个人主页:洋不写bug的博客
🎇所属专栏:Java学习之旅,从入门到进阶
🎇对于数据的基础知识不太理解的,可以看上篇博客的第7部分的简介,对于搭建环境有问题的,也可以看上篇博客:上篇博客
🎇铁汁们对于Java的各种常用核心语法(不太常用的也有😆),都可以在上面的Java专栏学习,专栏正在持续更新中🐵🐵,有问题可以写在评论区或者私信我哦~

1,基础数据类型

byte short int long float double char boolean

1,int

public class Test1 {
   public static void main(String[] args) {
      System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}

在这里插入图片描述

这里的Integer是Java中的类,MAX_VALUE和MIN_VALUE是这个类的属性(这是很靠后面的内容,现在只需了解一下
如果我们给变量赋的值超出了数据类型的范围,IDEA就会发出警告:

在这里插入图片描述

2,long

public class Test1 {
   public static void main(String[] args) {
      System.out.println(Long.MAX_VALUE);
      System.out.println(Long.MIN_VALUE);
   }
}

打印结果如下:
在这里插入图片描述

这里的Long也是Java中的一个类,跟上面的Integer相似,这个也是后面的概念,现在了解一下即可。

3,小数

按照上一篇博客发布的内容,float和double用于表示小数,float是单精度浮点数,double是双精度浮点数
float占4个字节,double占8个字节。因此,double能表示小数点后的位数更高。float为能够提供7位十进制数的精度,double能提供15-16位十进制数的精度。

直接打印一个小数,这个小数默认是double类型,要想定义float类型的常量,需要使用f/F作为后缀。

 public static void main(String[] args) {
     float a = 0.5f;
   }

4,小数误差

public class Test1 {
   public static void main(String[] args) {
      double a = 1.1;
      System.out.println(a*a);
   }
}

结果如下:
在这里插入图片描述

结果应该是1.21,但是这里还是差了一点,原因就是double/float这样的类型,计算时无法精确的表示一个小数,存在误差

再看下面这段代码,用double计算时也会存在误差:

public class Test1 {
   public static void main(String[] args) {
      double a = 0.1;
      double b = 0.2;
      System.out.println(a + b);
   }
}

在这里插入图片描述

这种存在误差的情况在C++,Phython,C中都有存在

5,字符类型(char)

字符类型的字面值常量,使用’'(单引号)来表示
Java 字符类型,通过两个字节来表示的,通过unicode编码对内容进行编排。(在C语言中char是一个字节)

public class Test1 {
   public static void main(String[] args) {
     char s = 'a';
     System.out.println(s);
   }
}

在这里插入图片描述

6,布尔类型

布尔类型在C中是bool,在Java中是boolean,不仅名字不同,C和Java中布尔类型的语法也有很大区别

public class Test1 {
   public static void main(String[] args) {
     boolean a = true;
     boolean b = false;
     System.out.println(a);
      System.out.println(b);
   }
}

在这里插入图片描述

在Java中,boolean类型是单独的类型,true 和 false,跟0和1没有关系,也就是和int类型无关,跟非0,0这样的设定无关。


在C中,布尔类型跟0和非0是可以相互转变的,C语言中的这种设定其实是有些摸棱两可的,我们看到一个数字时,可能不知道到底表示true和false,还是单纯就是一个数字



这点是Java和C语言中的一个重要的区别,在初学时一定要适应这个改变!!!

2,引用数据类型

1, String类型

String是一个很复杂的类型(Java中提供的一个类),专栏中比较靠后的博客中会详细提到String类型,这里只是介绍一下它的用法。

打印字符串:

public class Test1 {
    public static void main(String[] args) {
        String s = "hello";
        System.out.println(s);
    }
}



打印字符串的长度:

public class Test1 {
    public static void main(String[] args) {
        String s = "hello";
        System.out.println(s.length());
    }
}

s.length(),这个方法是变量.方法名(变量就是对象,方法就是函数,这些在后面发布的博客中也会讲到),

重点强调:Java中的字符串,和C中的字符串,有本质区别

3,不同数据类型的转换

1,隐式转换

隐式转换就是不需要写任何的额外代码,能够自动转换,例如把int赋值给long,就会自动把int转为long,是将范围小的类型的数据转化为范围大的类型的数据(可以理解为大学生可以做初中生的题,一定能做出来)!!!

public class Test1 {
   public static void main(String[] args) {
    int a = 10000;
    long b;
    b = a;
   }
}

int是4个字节,long是8个字节,int能存下的东西,long肯定也能存下,因此就可以直接赋值,不用写额外的代码。(如果对于各种数据类型的长度和表示范围不太清楚的可以看上篇博客的第7部分,链接在前言中💪)

2,显示转换

显示转换就好比让高中生去做大学生的高数题,如果比较简单的话,能够做出来,如果比较难,是高中生没接触过的知识的话,那就做不出来

我们看,让一个int类型的变量去存long类型的变量,那int就有可能存不下,那这时idea就会给我们报错, 上面的意思是要求赋值给b的数据的类型是int(Required type),但是却提供了一个long类型的数据(Provided)。

在这里插入图片描述


那我们如果想让这里不报错,正常运行,就需要进行下面的强制类型转换,把一个long类型强制转换为一个int类型:

 public static void main(String[] args) {
    long a = 100_0000_0000_0000_0000L;
    int b;
    b = (int)a;
   }

那强制类型转化,就能用int表示这么大的数了吗 ???
int当然表示不了这么大的数,我们看打印结果,就会发现打印的是一个负数,这是为什么呢?

在这里插入图片描述

int类型 4个字节,只能存32个比特位,而100_0000_0000_0000_0000转为二进制超出了32个比特位,只会存后32个比特位,而恰好这32 位最高位是 1(符号位为 1),则按补码规则,这个数会被解析为负数。



我们再看这样段代码,这里虽然进行了强制类型转换,但是打印还是正常。

 public static void main(String[] args) {
    long a = 9000L;
    int b;
    b = (int)a;
    System.out.println(b);
   }

在这里插入图片描述
那就能总结出:

  1. 进行强制类型转化时,如果数据超出了变量的数据类型的表达范围,只截取数据的后32位,用于计算肯定出错
  2. 如果数据没有超出变量的数据类型的表达范围,那么打印计算就都不会出错。
  3. 另外,Java中本身就不推荐使用强制类型转化




    最后,强制类型转换时,不相干的类型不能相互转化,当然我们一般也不会这样写

    在这里插入图片描述

    3,类型提升

    类型提升是自动发生的,针对两个不同类型的变量进行算数运算时,就会触发类型提升操作(小的类型转为大的类型),大家可以先想想下面这段代码为什么会报错
    在这里插入图片描述

    这里一个long类型和一个int类型相加,就会触发类型提升(类型提升成范围大的数据类型),因此相加的结果就会变成long类型

    有两个方法可以解决这个问题

    1. 进行强制类型转化(也就是前面的强制类型转换)
    2. 用long类型的变量来接收a和b的和
      int c = (int)(a + b);
      //       long c = a + b;
      




      这种自动类型提升也存在于浮点数:

      public class Test1 {
          public static void main(String[] args) {
            int a = 1;
            int b = 2;
            double c = 2.0;
            System.out.println(a/b);
            System.out.println(a/c);
          }
      }
      

      在这里插入图片描述

      两个int类型相除结果就还是int类型,int类型舍去小数部分不表示,而如果相除时分母或者分子有一个是double类型,那相除的结果就是double类型




      特例:

      在这里插入图片描述
      在这里插入图片描述

      这里报错是因为Java中有这样的一个规则,那就是short或者byte类型的数据,在进行算术运算时,即使是相同类型,也会触发类型提升,提升成int类型
      之所以要直接对它们进行类型提升,这是因为short/byte本身表示的范围太小了(byte一个字节,short两个字节)。

      要解决还是前面的思路,要不进行强制类型转化,要不就直接改变变量的类型。

      public class Test1 {
          public static void main(String[] args) {
           short a = 10;
           short b = 20;
      //     short c = (short) (a + b);
           int c = a + b;
          }
      }
      

      4,数字类型转String

      public class Test1 {
          public static void main(String[] args) {
              String s = 10 + " ";
              System.out.println(s);
          }
      }
      

      这里就直接使用 + 把int和“ ”(空格)进行 + 运算,得到的结果仍为字符串,空格就是字符串,通过数字加上空格,可以把数字转为字符串。



      还有一种方法,就是使用valueOf方法把数字转为String类型(这里写成String.valueOf是因为String是一个类,valueOf是这个类中的一个方法),至于为什么要这样写,后面会提到

      public class Test1 {
          public static void main(String[] args) {
            String s2 = String.valueOf(10);
            System.out.println(s2);
          }
      }
      

      以上两种方法,也适用于long,double,short等其他数字类型转为String类型。

      5,String转数字类型

      public class Test1 {
          public static void main(String[] args) {
              String s = "10";
              int a = Integer.parseInt(s);
              double b = Double.parseDouble(s);
              long c = Long.parseLong(s);
          }
      }
      

      这里的Integer,Double,Long都是类,一会稍微提一下这个概念。

      4,类的简介

      Java体系中,已经给我们准备了大量的类,每个类都有很多的方法,可以让我们直接使用。
      当前我们可能会见到一些新鲜的类/方法,比如数据类型转换时,里面的Integer,Double,Long都是类,后面的.是这个类的方法。

      public class Test1 {
          public static void main(String[] args) {
              String s = "10";
              int a = Integer.parseInt(s);
              double b = Double.parseDouble(s);
              long c = Long.parseLong(s);
          }
      }
      

      这里不求一下子就能掌握和学习,在学习的过程中,很多东西会反复的去使用,这里大家想要了解清楚,也可以翻Java文档(api),上篇博客讲的有具体怎么下载,可以看一下。但是主要还是要在学习中逐渐掌握。

      这就像做饭一样,api(文档)就相当于那些菜谱,但是有的说放适量盐,白糖,具体放多少还是要自己在实践中掌握。Java也是这样,不要死记硬背,要逐渐在学习中去掌握!!!

      5,变量

      变量我们在C语言中已经接触过,这里稍微复习一下,像下面的这些a,b,c,d,f都是不同类型的变量

      在这里插入图片描述

      在这里插入图片描述





      可能有很少的人会写成下面这样,许多变量的定义挤在一行里面,这样有点不美观,最好还是一个定义占一行:
      在这里插入图片描述





      当定义了一个变量,但是没有给它赋值,也就是没有初始化,这里就会报错(这个变量没有初始化)。(initialized 翻译:初始化)
      在这里插入图片描述

      结语💕💕

      Java部分的变量和数据类型有一些地方跟C语言中的区别还是比较大的,初学时很容易不适应,包括Java中引入了类的概念,这个我们学习一段时间,就会慢慢理解适应。

      附上一句励志文案,祝大家学习突飞猛进💪💪💪!!!
      在这里插入图片描述

      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值