彻底搞懂Java的数据类型

这是 JavaMemo 专栏的第三篇原创,首发于大众号「JavaMemo」

彻底搞懂Java的数据类型

众所周知,程序中每个变量在内存中都占用一定的空间,至于变量占用多少内存则完全取决于其数据类型。

在 Java 中变量的数据类型能够分为两大类:

  • 原始数据类型
  • 目标类型

原始数据类型,有的文档里也称作根底数据类型。原始类型的变量直接在分配给变量的内存中存储变量的值。例如,数字或字符型的变量,留意是字符不是字符串变量

目标类型的变量不同于原始类型的变量。目标类型的变量也称为引证,由于变量自身不持有目标的数据,持有的是对目标的引证,引证指向内存中存储整个目标的其他位置(内存地址)。经过存储在变量中的引证,程序能够拜访被引证目标的字段和方法。

能够有许多不同的变量引证同一个目标。可是,这对于原始数据类型是不可能的。

原始数据类型

下表列出了,Java 提供的 8 种根底数据类型

彻底搞懂Java的数据类型

这些是原始数据类型意味着它们不是目标,也不是对目标的引证(类和目标将在本 Java 教程后边的章节中学习)。

目标类型

Java 原始的数据类型也有与之对应的目标类型版别,有时候也把这些类型称为包装类。下面的中心目标数据类型列表中包括原始类型对应的目标类型,还包括 Java 中的别的一个非常重要的中心目标类型 — String 类型。

目标类型 描绘
Boolean boolean 类型的包装类
Byte byte 类型的包装类
Short short 类型的包装类
Character char 类型的包装类
Integer int 类型的包装类
Long long 类型的包装类
Float float 类型的包装类
Double double 类型的包装类
String 字符串类型,Java 里字符串不是原始类型,而是目标类型,其本质上是只读的 char[] 数组。

上面列出的便是 Java 中提供的最中心的目标类型,当然咱们还能够经过自定义 Class 创立更杂乱的数据类型。值得留意的一点是 Java 中的字符串并不是原始类型,String 其本质上是由只读 char[] 数组完成的目标类型,关于字符串后边会有章节进行具体的阐明,这里先重视 Java 的数据类型。

下面是几个在程序中,声明和初始化目标类型的例子:

IntegermyInteger;
myInteger=newInteger(45);
CharactercapitalA=newCharacter('A');
StringmyString=newString("ABC");

类型的装箱和拆箱

在 Java 5 之前,咱们必须在原始类型的包装类目标上调用方法,才干将它们存储的原始类型的值获取出来。例如:

IntegermyInteger=newInteger(45);
intmyInt=myInteger.intValue();

从 Java 5 开端,Java 引入了 “主动装箱和拆箱”(Auto box/unbox) 的机制。这意味着 Java 能够在需要的时候主动把原始类型的值“装箱”到对应的包装类目标中,也能够从包装类目标中主动 “拆箱” 出对应的原始值。例如,之前的例子能够这样写:

IntegermyInteger=newInteger(45);
intmyInt=myInteger;

在这种情况下,Java 会主动“拆箱” myInteger 目标,从中提取 int 值并将该值赋给 myInt 变量。

与之类似的,如果没有主动“装箱”,咱们在原始类型和对应的包装类之间进行转换时,需要这么写:

intmyInt=45;
IntegermyInteger=newInteger(myInt);

有了主动“装箱”后:

IntegermyInteger=45;

Java 会主动将原始数据类型“装箱”到相应类型的包装类目标中。

Java 的主动装箱功能使咱们能够在一般需要该数据类型的包装类目标的当地仍然运用原始数据类型的变量,反之亦然。不过要记住一个坑。 目标类型的变量(值是目标的引证)能够指向 null,这意味着它能够不指向任何实践存在的目标。

如果测验将 null 主动拆箱转换为原始值,程序执行到这块时将收到 NullPointerException 异常(导致程序失败的过错),比如下面这个例子:

IntegermyInteger=null;
intmyInt=myInteger;

这段代码能够编译,但执行时会导致 NullPointerException,由于变量 myInteger 指向 null (不指向任何目标)。因此不可能拆箱出它指向的目标的值。

进制、bit和Byte

提到数据类型,必然会跟随的一个描绘,便是它们占用的字节数,能够表明多少位等等。那么最终,再让咱们快速过一下 进制、bit 和 Byte 三者之间的联系。

十进制

每一位能够是0~9这10个值,到10进位,一百用十进制表明便是100,十便是10。

二进制

每一位能够是0和1这两个值,到2进位。一百用二进制表明是1100100,十是1010。

十六进制

每一位能够是0~F这16个值,到16进位。一百用十六进制表明便是64,十便是A。

bit和byte

  • 一个二进制的位叫做一个bit。用b表明,带宽中的单位,都是b。
  • 八个二进制的位,组成一个byte,俗称大B。硬盘等存储的最小单位,是B。
  • Byte 是计算机中基本的衡量存储的单位,计算机对外界不会运用 b 作为存储的单位。

总结

这篇文章的内容依然很简单,但不要由于就简单就忽视,打好根底了后边打怪晋级才干快,如果你喜欢我的文章欢迎把我的文章分享给更多人,后边咱们会把 Java 数据类型中最稍微杂乱点的数组以及日常运用操作特多的String类型单独写文章整理一下它们知识点,以及常见的引起程序过错的圈套