Java核心技术卷I-3.3(Java核心技术卷I-3.3)

Java是一种强类型语言这就意味着必须为每一个变量声明一种类型在Java中,一共有8种基本类型(primitive type),其中有4种整型,2种浮点型、1种用于表示Unicode编码的字符单元的字符类型char(请参见论述char类型的章节)和1章用于表示真值的boolean类型,我来为大家讲解一下关于Java核心技术卷I-3.3?跟着小编一起来看一看吧!

Java核心技术卷I-3.3(Java核心技术卷I-3.3)

Java核心技术卷I-3.3

Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共有8种基本类型(primitive type),其中有4种整型,2种浮点型、1种用于表示Unicode编码的字符单元的字符类型char(请参见论述char类型的章节)和1章用于表示真值的boolean类型。

注释:Java有一个能够表示任意精度的算术包,通常称为"大数值"(big number)。虽然被称为大数值,但它并不是一种新的Java类型,而是一个Java对象。本章稍后将会详细地介绍它的用法。

3.3.1 整型

整型用于表示没有小数部分的数值,它允许是负数。Java提供了4种整型,具体内容如表3-1所示。

思考:byte为什么是-128-127?

至于为什么8位是-128~127,是由于最高一位存储符号位,所以剩下7位代表数值大小,能从0表示到127

所以能从-127表示到127,但由于 0和-0都代表0,重复了,所以,多出一个位子,放到负数,让-0代表-128。

所以byte的范围是-128~127。

参考链接:blog.csdn.net/dicong9715/…

通常情况下,int类型最常用。但是如果表示星球上居住的人数,就需要使用long类型了。byte和short类型主要用于特定的应用场合,例如,底层的文件处理或者需要控制占用存储空间量的大数组。

在Java中,整型的范围与运行Java代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。于此相反,C和C 程序需要针对不同的处理器选择最为有效的整型,这样就有可能造成一个在32位处理器上运行很好的C程序在16位系统上运行却发生了整型溢出。由于Java程序必须保证在所有机器上都能够得到相同的运行结果,所以每一种数据类型的取值范围必须固定。

长整型数值有一个后缀L(如4000000000L)。十六进制数值有一个前缀0x(如0xCAFE)。八进制有一个前缀0,例如010对应八进制中的8。很显然,八进制表示法比较容易混淆,所以建议最好不要使用八进制常数。

C 注释:在C和C 中,int表示的整型与目标机器相关。在8086这样的16位处理器上整型数值占2字节;在Sun SPARC这样的32位处理器上,整型数值占4字节;而在Intel Pentium处理器上,C和C 整型依赖于具体的操作系统,对于DOS和Windows 3.1,整型数值占2字节。当Windows程序使用32位模式时,整型数值占4字节。在Java中,所有的数值类型所占据的字节数量与平台无关。

注意,Java没有任何无符号类型(unsinged type)

3.3.2 浮点类型

浮点类型用于表示有小数部分的数值。在Java中有2种浮点类型,具体内容如表3-2所示。

double表示这种类型的数值精度是float类型的两倍(有人称之为双精度)。绝大部分应用程序都采用double类型。在很多情况下,float类型的精度很难满足需求。例如,用7位有效数字足以精确地表示普通雇员的年薪,但表示公司总裁的年薪可能就不够用了。实际上,只有很少的情况适用适用float,例如,需要快速地处理单精度数据,或者需要存储大量数据。

float类型的数值有一个后缀F(例如,3.402F)。没有后缀F的浮点数值(3.402)默认为double。当然,也可以在浮点数值后面添加后缀D(例如,3.402D)。

注释:在JDK 5.0中,可以使用十六进制表示浮点数值。例如,0.125可以表示成0x1.0p-3。

在十六进制表示法中,使用p表示指数,而不是e。注意,尾数采用十六进制,指数采用

十进制。指数的基数是2,而不是10。

所有的浮点数值计算都遵循IEEE 754规范。下面是用于表示溢出和出错情况的三个特殊的浮点数值:

• 正无穷大

public static final float POSITIVE_INFINITY = 1.0f / 0.0f;

• 负无穷大

public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

• NaN(不是一个数字)

public static final float NaN = 0.0f / 0.0f;

例如,一个正整数除以0的结果为正无穷大。计算0/0或者负数的平方根结果为NaN。

注释:常量Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN

(与相应的Float类型的常量一样)分别表示这三个特殊的值,但在实际应用中很少遇到。

特别要说明的是,不能这样检测一个特定值是否等于Double.NaN:

if (x == Double.NaN)// is never true

所有“非数值”的值都认为是不相同的。然而,可以使用Double.isNaN方法:

if (Double.isNaN(x)) //check whether x is "not a number"

警告:浮点数值不适用于禁止出现舍入误差的金融计算中。例如,命令System.out.println

(2.0-1.1)将打印出0.8999999999999999,而不是人们想像的0.9。其主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示分数1/10。这就好像十进制无法精确地表示1/3一样。如果需要在数值计算中不含有任何舍入误差,就应该使用BigDecimal类,本章稍后将介绍这个类。

3.3.3 char类型

char类型用于表示单个字符。通常用来表示字符常量。例如:'A'是编码为65所对应的字符常量。与"A"不同,"A"是一个包含字符A的字符串。Unicode编码单元可以表示为16进制值,其范围从\u0000到\uffff。例如:\u2122表示注册符号,\u03C0表示希腊字母π。

除了可以采用转义序列符\u表示Unicode代码单元的编码之外,还有一些用于表示特殊字符的转义序列符,请参看表3-3。所有这些转义序列符都可以出现在字符常量或字符串的引号内。例如,'\u2122'或"Hello\n"。转义序列符\u还可以出现在字符常量或字符串的引号之外(而其他转义序列不可以)。例如:

public static void main(String\u005B\u005D args)

这种形式完全符合语法规则,\u005B和\u005D是[和]的编码。

要想弄清char类型,就必须了解Unicode编码表。Unicode打破了传统字符编码方法的限制。在Unicode出现之前,已经有许多种不同的标准:美国的ASCII、西欧语言中的ISO 8859-1、俄国的KOI-8、中国的GB118030和BIG-5等等。这样就产生了下面两个问题:一个是对于任意给定的代码值,在不同编码方案下有可能对应不同的字母;而是采用大字符集的语言其编码长度有可能不同。例如,有些常用的字符采用单字节编码,而另一些字符则需要两个或更多个字节。

设计Unicode编码的目的就是要解决这些问题。在20世纪80年代开始启动设计工作时,人们认为两个字节的代码宽度足以能够对世界上各种语言的所有字符进行编码,并有足够的空间留给未来的扩展。在19911年发布了Unicode 1.0,当时仅占用65536个代码值中不到一半的部分。在设计Java时决定采用16位的Unicode字符集,这样会比使用8位字符集的程序设计语言有很大的改进。

十分遗憾,经过一段时间,不可避免的事情发生了。Unicode字符超过了65536个,其主要原因是增加了大量的汉语、日语和韩国语言中的表意文字。现在,16位的char类型已经不能满足描述所有Unicode字符的需要了。

下面利用一些专用术语解释一下Java语言解决这个问题的基本方法。从JDK5.0开始。代码点(code point)是指与一个编码表中的某个字符对应的代码值。在Unicode标准中,代码点采用十六进制书写,并加上前缀U ,例如U 0041就是字母A的代码点。Unicode的代码点可以分为17个代码级别(code plane)。第一个代码级别称为基本的多语言级别(basic mulitlingual plane),代码点从U 0000到U FFFF,其中包括了经典的Unicode代码;其余的16个附加级别,代码点从U 10000到U 10FFFF,其中包括了一些辅助字符(supplementary character)。

UTF-16编码采用不同长度的编码表示所有的Unicode代码点。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元(code unit);而辅助字符采用一对连续的代码单元进行编码。这样构成的编码值一定落入基本的多语言级别中空闲的2048字节内,通常被称为替代区域(surrogate area)[U D800--U DBFF用于第一个代码单元,U DC00--U DFFF用于第二个代码单元]。这样设计十分巧妙,我们可以从中迅速地知道一个代码单元是一个字符的编码,还是一个辅助字符的第一或第二部分。例如,对于整数集合的数学符号,它的代码点是U 1D56B,并且是用两个代码单元U D835和U DD6B编码的。

在Java中,char类型用UTF-16编码描述一个代码单元。

我们强烈建议不用再程序中使用char类型,除非确实需要对UTF-16代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示(有关这方面的内容将在稍后讨论)。

3.3.4 boolean 类型

boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。

C 注释:在C 中,数值或指针可以代替boolean值。整数0相当于布尔值false,非0值相当于布尔值true。在Java中则不行。因此,Java应用程序员不会遇到下述麻烦:

if(x=0)//oops...meant x==0

在C 中这个测试可以编译运行,其结果总是false。而在Java中,这个测试将不能通过编

译,其原因是整数表达式x = 0不能转换为布尔值。

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页