Java的数据类型

xiaoxiao2021-03-01  9

Java数据类型

 

Java虚拟机是通过某些数据类型来执行计算的,数据类型及其运算都是由Java虚拟机规范严格定义的。

数据类型分为两种:基本数据类型引用数据类型基本类型的变量持有原始值,而引用数据类型的变量持有引用值

术语“引用值”指的是对某个变量的引用,而不是该对象本身。与此相对的,原始值则是真正的原始数据。

下图是Java虚拟机中数据类型的描述。

       

 

Java语言中的所有基本类型同样也都是Java虚拟机中的基本数据类型。但是boolean有点特别,虽然Java虚拟机也把boolean看做基本类型,但是指令集对boolean只有很有限的支持。当编译器吧Java源代码编译成字节码时,他会用int或byte来表示boolean。在java虚拟机中,false是由整数零来表示的,所有非零整数都表示true。涉及boolean值的操作则会用int。另外,boolean数组是当做byte数组来访问的,但是在“堆”区他也可以被表示为位域。

 

除了boolean类型外,java语言中的基本类型构成了java虚拟机中的数值类型。

虚拟机中的数值类型分为:整数类型(包括byte,int,long,char)浮点数类型(包括float,double)

和java语言一样,Java虚拟机的基本类型的值在任何地方都是一致的,比如,不管底层的主机平台是什么,一个long在任何虚拟机中总是一个64为位二进制补码表示的有符号整数。

 

java虚拟机中还有一个只在内部使用的基本数据类型:returnAddress,java程序员不能使用这个类型。这个基本类型被用来实现java程序中的finally子句。

 

java虚拟机的引用类型被统称为“引用”(reference),有三种引用类型类类型接口类型以及数值类型,他们的值都是对动态创建对象的引用。

还有一种特殊的引用值null。他表示该变量没有引用任何对象。

 

java虚拟机规范定义了每个数据类型的取值范围,但是却没有定义他们的位宽。存储这些类型的值所需的占位宽度,是由具体的虚拟机实现的设计者决定的。java虚拟机数据类型的取值范围如下图所示:

 

 

 

补充说明

 

从JDK 5.0开始,Java里面出现了自动拆箱解箱的操作,基于这点需要做一定的说明:

  对应原始的数据类型,每种数据类型都存在一个复杂类型的封装类,分别为Boolean、Short、Float、Double、Byte、Integer、Long、Character,这些类型都是内置的封装类,这些封装类(Wrapper)提供了很直观的方法,针对封装类需要说明的是,每种封装类都有一个xxxValue()的方法,通过这种方法可以把它引用的对象里面的值转化成为原始变量的值,不仅仅如此,每个封装类都还存在一个valueOf(String)的方法直接把字符串对象转换为相应的简单类型。

  在JDK 5.0之前,没有存在自动拆解箱的操作,即Auto Box操作,所以在这之前是不能使用以下方式的赋值代码的:

Integer a = 0; //这种赋值方式不能够在JDK 1.4以及以下的JDK编译器中通过

但是JDK 5.0出现了自动拆解箱的操作,所以在JDK 5.0以上的编译器中,以上的代码是可以通过的

      Java提供了两个专门的类进行高精度运算:BigInteger与BigDecimal,虽然Java原始变量都具有对应的封装类型,但是这两个变量没有对应的原始类型,而是通过方法来提供这两种类型的一些运算,其含义为普通类型能够做的操作,这两个类型对应都有,只是因为精度过大可能效率不够高。至于这两个类的具体操作可以参考JDK的相关API文档。

     若要求精度的结果,尽量避免使用float和double.

     关于基本类型中数值类型的还有一个自动转换和强制转换的概念,后续再阐述吧。

 

 

字长的考量

 

java虚拟机中,最基本的数据单元就是字(word),他的大小是由每个虚拟机实现的设计者决定的。jvm规范中明确规定了,字长必须足够大,至少是一个字单元就足以持有byte、short、int、char、float、returnAddress或者reference类型的值,而两个字单元就足以持有long或者double类型的值

因此虚拟机实现的设计者至少得选择32位作为字长。或者选择更为高效的字长大小。通常根据底层主机平台的指针长度来选择字长。

 

在Java虚拟机规范中,关于运行时数据区的大部分内容,都是基于“字”这个抽象概念的。比如,关于栈帧的两个部分-------局部变量和操作数栈------都是按照“字”来定义的。这些内存区域能够容纳任何虚拟机数据类型的值,当把这些值放入局部变量或者操作数栈中时,他将占一个或两个字单元。

 

在运行时,Java程序无法侦测到底层虚拟机的字长大小;同样,虚拟机的字长大小也不会影响程序的行为-------他仅仅是虚拟机实现的内部属性。

转载请注明原文地址: https://www.6miu.com/read-3650115.html

最新回复(0)