彻底搞懂 Java 变量的数据类型

这是 JavaMemo 的第 3 篇原创


本篇文章,我们来学习一下 Java 的数据类型,文章的大纲如下。

f642bd0b90cae51a942dd7856f0d5c60.png

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

在 Java 中变量的数据类型可以分为两大类:

  • 原始数据类型

  • 对象类型

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

对象类型的变量不同于原始类型的变量。对象类型的变量也称为引用,因为变量本身不持有对象的数据,持有的是对对象的引用,引用指向内存中存储整个对象的其他位置(内存地址)。通过存储在变量中的引用,程序可以访问被引用对象的字段和方法。

可以有许多不同的变量引用同一个对象。但是,这对于原始数据类型是不可能的。

原始数据类型

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

类型名

描述

boolean

布尔类型:占用4个Byte,值域是true和false。

变量声明初始化方式:boolean one = true;

byte

byte 类型占用一个byte,值域是

-128~127。

short

short 类型占用两个byte,值域是-32768~32767

char

占用2个Byte,值域是0~65535 (能表示所有Unicode字符)

变量声明初始化方式:

char letter = 'A';

int

int类型占用4个byte,值域是-2,147,483,648~2,147,483,647,Java中整数值缺省是int类型

long

long类型占用8个byte,值域是-9,223,372,036,854,775,808~9,223,372,036,854,775,807。

Java中Long类型的值用数字后带一个"L"表示它是Long类型的值。

变量声明初始化方式:long a = 100000L;

float

float 数据类型是单精度、32位占用4个Byte。float 在储存大型浮点数组的时候可节省内存空间,默认值是0.0F,浮点类型不能用于表示精确的值。

变量声明初始化方式:float f1 = 234.5F

doubule

double 数类型是双精度、64 位占用8个Byte。浮点数的默认类型为 double 类型;double类型同样不能表示精确的值,默认值是 0.0D。

变量声明初始化方式:

double   d4  =  8.0D;

double   d5  =  12.9867;


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

对象类型

Java 原始的数据类型也有与之对应的对象类型版本,有时候也把这些类型称为包装类。下面的核心对象数据类型列表中包含原始类型对应的对象类型,还包含 Java 中的另外一个非常重要的核心对象类型 -- String 类型。

对象类型描述
Booleanboolean 类型的包装类
Bytebyte 类型的包装类
Shortshort 类型的包装类
Characterchar 类型的包装类
Integerint 类型的包装类
Longlong 类型的包装类
Floatfloat 类型的包装类
Doubledouble 类型的包装类
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 变量引用的 Integer 对象,从中提取 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 类型单独写两篇文章整理一下它们知识点,以及常见的引起程序错误的陷阱。

期待你的点赞和关注~!

d23c4f7078e579651a5416dd0a95cb10.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值