Java数据类型
Java是一种强类型语言。这意味着每个变量都必须具有声明的类型。
Java有八种原始类型。 其中有四个是整型。 两种是浮点数类型; 一种是字符类型char,用于Unicode编码方案中的代码单元。
注意:Java有一个任意精度的算术软件包。 但是,所谓的“big numbers”是Java对象,而不是原始的Java类型。
①整数类型
整数类型用于不带小数部分的数字, 允许负值。 Java提供了表中所示的四种整数类型
在大多数情况下,int类型是最实用的。thebyte和short类型主要用于特殊应用程序,例如低级文件处理,或在存储空间非常宝贵的情况下用于大型数组。
在Java中,整数类型的范围不取决于要运行的计算机。这减轻了想要将软件从一个平台迁移到另一个平台甚至在同一平台上的操作系统之间迁移的程序员的痛苦。 相反,C和C ++程序对每个处理器使用最有效的整数类型。 结果,在32位处理器上运行良好的C程序可能在16位系统上表现出整数溢出。由于Java程序在所有计算机上必须以相同的结果运行,因此各种类型的范围是固定的。
长整数后缀L或l(例如4000000000L)
十六进制十进制数的前缀为0x或0X(例如0xCAFE)
八进制数字的前缀为0(例如010为8)
这很容易混淆,因此建议不要使用八进制常量。
从Java 7开始,您可以用二进制代码编写数字,前缀为0b或0B。 例如,0b1001是9。同样从Java 7开始,您可以在数字文字之间添加下划线,例如1_000_000(0b1111_0100_0010_0100_0000)来表示一百万。 下划线仅适用于人眼。 Java编译器会自动删除它们。
C ++注:在C和C ++中,诸如int和long之类的类型的大小取决于目标平台。 在8086之类的16位处理器上,整数是2个字节,而在Pentium或SPARC之类的32位处理器上,它们是4个字节的数量。 同样,longvalue在32位处理器上为4字节,在64位处理器上为8字节。 这些差异使得编写跨平台程序具有挑战性。 在Java中,所有数字类型的大小均与平台无关。请注意,Java没有int,long,short或byte类型的任何无符号(unsigned)版本。
注意:如果使用永远不能为负的整数值,并且确实需要额外的位,则可以谨慎地将带符号整数值解释为无符号。 例如,您可能希望范围从0到255,而不是让表示从–128到127的范围。您可以将其存储在abyte中。 由于二进制算术的性质,加法,减法和乘法将在不溢出的情况下起作用。 对于其他操作,请调用byte.toUnsignedInt(b)以获取介于0到255之间的整数值,然后处理该整数值并将其转换回字节。 Integer类和Long类具有无符号除法和余数的方法
②浮点类型
浮点类型表示带有小数部分的数字。 表中显示了两种浮点类型
双精度名称是指这些数字的精度是浮点型精度的两倍。(有些人称这些为双精度数字。)float的有限精度(6-7个有效数字)对于许多情况来说根本是不够的。 仅当使用需要浮点值的库或需要存储大量浮点值时,才使用浮点值。
float类型的数字后缀为F或f(例如3.14F)。 没有F后缀(例如3.14)的浮点数始终被视为double类型。 您可以选择提供D或d后缀(例如3.14D)。
注意:您可以用十六进制指定浮点文字。 例如,0.125 = 2-3可以写为0x1.0p-3。 在十六进制表示法中,您使用ap,notane来表示指数。 (Ane是十六进制数字。)请注意,尾数用十六进制写,指数用十进制写。 指数的底数是2,而不是10。
所有浮点计算都遵循IEEE 754规范。 特别是,有三个特殊的浮点值表示溢出和错误:
•正无穷大
•负无穷大
•NaN(不是数字)
例如,将正数除以0的结果就是正无穷大。计算0/0 或负数的平方根产生NaN。
注意:浮点数不适用于无法容许舍入误差的财务计算。 例如,commandSystem.out.println(2.0-1.1)会打印0.8999999999999999,而不是您期望的0.9。这种舍入错误是由二进制数系统中浮点数表示这一事实引起的。分数1/10没有精确的二进制表示,就像小数系统中没有1/3的精确表示一样。 如果需要精确的数值计算而没有舍入误差,请使用BigDecimal类。
③字符类型
字符类型最初旨在描述单个字符。 但是,情况已不再如此。 如今,某些Unicode字符可以用一个char值描述,而其他Unicode字符则需要两个char值。char类型的字母值包含在单引号中。 例如,“ A”是值为65的字符常量。它不同于包含单个字符的字符串“ A”。 char类型的值可以表示为从\ u0000到\ uFFFF的十六进制值。 例如,\ u2122是商标符号(),\ u03C0是希腊字母pi(π)。除了\ u转义序列,还有几个特殊字符的转义序列, 您可以在带引号的字符文字和字符串中使用这些转义序列,例如'\ u2122'或“ Hello \ n”。 \ u转义序列(但没有其他转义序列)甚至可以在带引号的字符常量和字符串之外使用。 例如,
public static void main(String\u005B\u005D args)
是完全合法的——\ u005B和\ u005D是[and]的编码。
Unicode码
要完全了解char类型,您必须了解Unicode编码方案。
发明Unicode是为了克服传统字符编码方案的局限性。 在Unicode之前,有许多不同的标准:美国的ASCII,西欧语言的ISO 8859-1,俄语的KOI-8,中文的GB18030和BIG-5,等等。
这造成了两个问题。 首先,特定的代码值对应于不同编码方案中的不同字母。 其次,具有大字符集的语言的编码长度是可变的:一些常见字符编码为单个字节,另一些则需要两个或更多字节。Unicode是为解决这些问题而设计的。
在1980年代开始统一工作时,固定的2字节代码已足以对世界上所有语言使用的所有字符进行编码,并且有足够的空间来将来扩展-或当时所有人都在思考。 1991年,使用可用的65,536个代码值的一半以下的代码重新发布了Unicode 1.0。
Java是从头开始设计的,以使用16位Unicode字符为基础,这是对使用8位字符的其他编程语言的重大改进。不幸的是,随着时间的推移,不可避免的事情发生了。 Unicode的字符数增加到65,536个以上,这主要归功于增加了用于中文,日文和韩文的大量表意文字。 现在,16位字符类型不足以描述所有Unicode字符。从Java 5开始,我们需要一些术语来解释如何在Java中解决此问题。
代码点是与代码中的字符相关联的代码值 编码方案。 在Unicode标准中,代码点以十六进制编写,并以U +开头,例如U + 0041表示拉丁字母A的代码点。Unicode的代码点分为17个代码平面。 第一个代码平面称为基本多语言平面,由“经典” Unicode字符组成,代码点为U + 0000至U + FFFF。 16个附加平面,其代码点为U + 10000至U + 10FFFF,用于容纳补充字符。UTF-16编码表示可变长度代码中的所有Unicode代码点。 基本的多语言平面中的字符表示为16位值,称为代码单位。 补充字符被编码为一对连续的代码单元。
这样的编码对中的每个值都落入基本多语言平面的2048个未使用值的范围中的473.3数据类型ptg27506709,称为替代区域(第一个代码单元的U + D800至U + DBFF,U + DC00至U + DFFF 对于第二个代码单元)。 这相当聪明,因为您可以立即知道代码单元是对单个字符进行编码,还是对补充字符的第一部分或第二部分进行编码。 例如,
(关于十进制集合的数学符号,http://math.ucr.edu/home/baez/octonions)
的代码点为U + 1D546,并由两个代码单元U + D835和U + DD46进行编码。
(有关编码算法的说明,请参见https://tools.ietf.org/html/rfc2781。)
在Java中,char类型描述了UTF-16编码的代码单元。我们强烈建议不要使用char 除非您实际上正在操作UTF-16代码单元。
④布尔类型
布尔类型具有两个值,false和true。 它用于评估逻辑条件。 您不能在整数和布尔值之间转换。
C ++注:在C ++中,可以使用数字甚至指针代替布尔值。 值0等于布尔值false,非零值等于true。 在Java中不是这种情况。 因此,Java程序员可以避免发生诸如
if(x = 0)// oops
之类的事故。在C ++中,这意味着x == 0,此测试可以编译并运行,并且始终将其评估为false。 在Java中,由于整数expression x = 0无法转换为布尔值,因此无法编译测试。
变量和常量
与每种编程语言一样,变量用于存储值。 常量是其值不变的变量。 在以下各节中,您将学习如何声明变量和常量。
①变量
在Java中,每个变量都有一个类型。 您可以通过先放置类型,后跟变量名来声明变量。 以下是一些示例:
double salary;
int vacationDays;
long earthPopulation;
boolean done;
注意每个声明末尾的分号。 分号是必需的,因为声明是完整的Java语句,并且所有Java语句都以分号结尾。
变量名必须以字母开头,并且必须是字母或数字序列。 请注意,Java中的“字母”和“数字”一词比大多数语言中的要广泛得多。 字母定义为“ A”-“ Z”,“ a”-“ z”,“ _”,“ $”或表示语言中字母的任何Unicode字符。 例如,德语用户可以在变量名中使用诸如“ä”之类的变音符号; 希腊语使用者可以使用π。 同样,数字是“ 0”-“ 9”,任何表示一种语言中的数字的Unicode字符。
像“ +”或“©”这样的符号不能在变量名中使用,空格也不能使用。 变量名称中的所有字符均有效,大小写也有效。 变量名的长度本质上是不受限制的。
提示:即使$是有效的Java字母,也不应在自己的代码中使用它,它应用于由Java编译器和其他工具生成的名称。
您也不能使用Java保留字作为变量名。从Java 9开始,不能将单个下划线用作变量名。 **Java的以后版本可以使用作为通配符。**您可以在一行上声明多个变量:
int i,j; //两者都是整数
但是,我们不建议您使用这种样式。 如果分别声明每个变量,则程序更易于阅读。
注意:如您所见,名称区分大小写,例如,hireday和hireDay是两个单独的名称。 通常,您不应该有两个仅在字母大小写不同的名称。 但是,有时很难想出变量和常量的好名字。 然后,许多程序员为变量赋予与类型相同的名称,例如
Box box; //“ Box”是类型,“ box”是变量名
其他程序员更喜欢为变量使用“ a”前缀:
Box aBox
②变量初始化
声明变量后,必须通过赋值语句显式初始化它——永远不能使用未初始化变量的值。例如,Java编译器将以下语句序列标记为错误:
int vacationDays;System.out.println(vacationDays); // ERROR--variable not initialized
您可以使用左侧的变量名称,等号(=),然后使用右侧带有适当值的某些Java表达式,为先前声明的变量赋值。
int vacationDays;vacationDays = 12;
您可以在同一行上声明和初始化变量。 例如:
int VacationDays = 12;
在Java中,将变量声明为尽可能接近首次使用的位置被认为是一种好的样式。
注意:从Java 10开始,如果可以从初始值推断出局部变量的类型,则无需声明它们的类型。 只需使用以下类型的关键字var即可:
var vacationDays = 12; // VacationDays是一个int
var greeting = “Hello”; //greeting是一个字符串
C ++注:C和C ++区分变量的声明和定义。 例如,int i = 10;是一个定义,而extern int i;是一个声明。 在Java中,没有声明与定义分开。
③常量
在Java中,使用关键字final表示常量。 例如:
public class Constants{
public static void main(String[] args) {
final double CM_PER_INCH = 2.54;
double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters: " + paperWidth * CM_PER_INCH + " by " + paperHeight * CM_PER_INCH); }
}
关键字final表示一次可以分配给该变量,然后一劳永逸地设置其值。 通常用alluppercase(全为大写字母)命名常量。在Java中创建常量可能更常见,因此可用于单个类中的多个方法。 这些通常称为类常量。使用关键字static final设置类常量。 这是一个使用类常量的示例:
public class Constants2{
public static final double CM_PER_INCH = 2.54;
public static void main(String[] args) { double paperWidth = 8.5;
double paperHeight = 11;
System.out.println("Paper size in centimeters: " + paperWidth * CM_PER_INCH + " by " + paperHeight * CM_PER_INCH); }
}
请注意,类常量的定义出现在main方法之外,因此,该常量也可以在同一类的其他方法中使用。此外,如果声明了该常量,例如在我们的示例中public,其他类的方法也可以 使用它-在我们的示例中为Constants2.CM_PER_INCH。
C ++注意:const是保留的Java关键字,但目前尚未用于任何用途。 您必须对常量使用final。
④枚举
有时,变量应仅包含一组受限制的值。 例如,您可以出售四种尺寸的衣服或比萨饼:小号,中号,大号和特大号。 当然,您可以将这些大小编码为整数1、2、3、4或字符S,M,L和X。但这是容易出错的设置。 变量保存错误的值(例如0或m)太容易了。只要出现这种情况,您就可以定义自己的枚举类型。枚举类型具有有限数量的命名值。 例如,
enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE };
现在,您可以声明以下类型的变量:
Size s = Size.MEDIUM;
Size类型的变量只能保存类型声明中列出的值之一,或者特殊值null表示该变量根本未设置为任何值.