彻底搞懂Java的数据类型
这是 JavaMemo 专栏的第三篇原创,首发于公众号「JavaMemo」
众所周知,程序中每个变量在内存中都占用一定的空间,至于变量占用多少内存则完全取决于其数据类型。
在 Java 中变量的数据类型可以分为两大类:
- 原始数据类型
- 对象类型
原始数据类型,有的文档里也称作基础数据类型。原始类型的变量直接在分配给变量的内存中存储变量的值。例如,数字或字符型的变量,注意是字符不是字符串变量。
对象类型的变量不同于原始类型的变量。对象类型的变量也称为引用,因为变量本身不持有对象的数据,持有的是对对象的引用,引用指向内存中存储整个对象的其他位置(内存地址)。通过存储在变量中的引用,程序可以访问被引用对象的字段和方法。
可以有许多不同的变量引用同一个对象。但是,这对于原始数据类型是不可能的。
原始数据类型
下表列出了,Java 提供的 8 种基础数据类型
这些是原始数据类型意味着它们不是对象,也不是对对象的引用(类和对象将在本 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 的数据类型。
下面是几个在程序中,声明和初始化对象类型的例子:
Integer myInteger;
myInteger = new Integer(45);
Character capitalA = new Character('A');
String myString = new String("ABC");
类型的装箱和拆箱
在 Java 5 之前,我们必须在原始类型的包装类对象上调用方法,才能将它们存储的原始类型的值获取出来。例如:
Integer myInteger = new Integer(45);
int myInt = myInteger.intValue();
从 Java 5 开始,Java 引入了 “自动装箱和拆箱”(Auto box/unbox) 的机制。这意味着 Java 可以在需要的时候自动把原始类型的值“装箱”到对应的包装类对象中,也可以从包装类对象中自动 “拆箱” 出对应的原始值。例如,之前的例子可以这样写:
Integer myInteger = new Integer(45);
int myInt = myInteger;
在这种情况下,Java 会自动“拆箱” myInteger 对象,从中提取 int 值并将该值赋给 myInt 变量。
与之相似的,如果没有自动“装箱”,我们在原始类型和对应的包装类之间进行转换时,需要这么写:
int myInt = 45;
Integer myInteger = new Integer(myInt);
有了自动“装箱”后:
Integer myInteger = 45;
Java 会自动将原始数据类型“装箱”到相应类型的包装类对象中。
Java 的自动装箱功能使我们能够在通常需要该数据类型的包装类对象的地方仍然使用原始数据类型的变量,反之亦然。不过要记住一个坑。 对象类型的变量(值是对象的引用)可以指向 null,这意味着它可以不指向任何实际存在的对象。
如果尝试将 null 自动拆箱转换为原始值,程序执行到这块时将收到 NullPointerException 异常(导致程序失败的错误),比如下面这个例子:
Integer myInteger = null;
int myInt = 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类型单独写文章整理一下它们知识点,以及常见的引起程序错误的陷阱
转载自:https://juejin.cn/post/7094070578889359396