原始数据类型

原文: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Java 编程语言是静态类型的,这意味着必须首先声明所有变量才能使用它们。这包括声明变量的类型和名称,如您所见:

  1. int gear = 1;

这样做会告诉程序一个名为“gear”的字段存在,保存数字数据,初始值为“1”。变量的数据类型确定它可能包含的值,以及可能对其执行的操作。除int外,Java 编程语言还支持其他七种原始数据类型。基本类型由语言预定义,并由保留关键字命名。原始值不与其他原始值共享状态。 Java 编程语言支持的八种原始数据类型是:

  • bytebyte数据类型是一个 8 位带符号的二进制补码整数。它的最小值为-128,最大值为 127(含)。 byte数据类型可用于在大型阵列中保存内存,其中节省的内存实际上很重要。它们也可用于代替int,其限制有助于澄清您的代码;变量范围有限的事实可以作为一种文档形式。

  • shortshort数据类型是一个 16 位带符号的二进制补码整数。它的最小值为-32,768,最大值为 32,767(含)。与byte一样,适用相同的指导原则:在内存节省实际上很重要的情况下,您可以使用short来节省大型阵列中的内存。

  • int :默认情况下,int数据类型是 32 位带符号的二进制补码整数,其最小值为-2 <sup>31</sup> ,最大值为 2 <sup>] 31</sup> -1。在 Java SE 8 及更高版本中,您可以使用int数据类型来表示无符号的 32 位整数,其最小值为 0,最大值为 2 <sup>32</sup> -1。使用 Integer 类将int数据类型用作无符号整数。有关更多信息,请参阅数字类一节。 [HTD8] Integer类中添加了compareUnsigneddivideUnsigned等静态方法,以支持无符号整数的算术运算。

  • longlong数据类型是 64 位二进制补码整数。带符号长度的最小值为-2 <sup>63</sup> ,最大值为 2 <sup>63</sup> -1。在 Java SE 8 及更高版本中,您可以使用long数据类型来表示无符号的 64 位长,其最小值为 0,最大值为 2 <sup>64</sup> -1。当您需要比int提供的值更宽的值时,请使用此数据类型。 Long 类还包含compareUnsigneddivideUnsigned等方法,以支持无符号长整数的算术运算。

  • floatfloat数据类型是单精度 32 位 IEEE 754 浮点数。其值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型,格式和值部分中指定。与byteshort的建议一样,如果需要在大型浮点数中保存内存,请使用float(而不是double)。绝不应将此数据类型用于精确值,例如货币。为此,您需要使用 java.math.BigDecimal 类。 数字和字符串涵盖BigDecimal和 Java 平台提供的其他有用类。

  • doubledouble数据类型是双精度 64 位 IEEE 754 浮点数。其值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型,格式和值部分中指定。对于十进制值,此数据类型通常是默认选择。如上所述,此数据类型不应用于精确值,例如货币。

  • booleanboolean数据类型只有两个可能的值:truefalse。将此数据类型用于跟踪真/假条件的简单标志。此数据类型表示一位信息,但其“大小”不是精确定义的内容。

  • charchar数据类型是一个 16 位 Unicode 字符。它的最小值为'\u0000'(或 0),最大值为'\uffff'(或 65,535(含))。

除了上面列出的八种原始数据类型之外,Java 编程语言还通过 java.lang.String 类为字符串提供特殊支持。将字符串括在双引号内将自动创建一个新的String对象;例如,String s = "this is a string";String对象是不可变,这意味着一旦创建,它们的值就无法更改。 String类在技术上不是原始数据类型,但考虑到语言给予它的特殊支持,您可能倾向于将其视为这样。您将在简单数据对象中了解有关String类的更多信息

默认值

声明字段时并不总是需要分配值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值为零或null,具体取决于数据类型。然而,依赖于这样的默认值通常被认为是糟糕的编程风格。

下表总结了上述数据类型的默认值。

数据类型 默认值(对于字段)
字节 0
0
INT 0
0L
浮动 0.0F
0.0D
烧焦 ‘\ u0000 的’
字符串(或任何对象) 空值
布尔

局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果无法初始化声明它的局部变量,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。

字面

您可能已经注意到在初始化基本类型的变量时不使用new关键字。原始类型是语言中内置的特殊数据类型;它们不是从类创建的对象。文字是固定值的源代码表示;文字直接在代码中表示,无需计算。如下所示,可以将文字分配给基本类型的变量:

  1. boolean result = true;
  2. char capitalC = 'C';
  3. byte b = 100;
  4. short s = 10000;
  5. int i = 100000;

整数文字

如果整数字面以Ll字母结尾,则为long类型;否则它是int类型。建议您使用大写字母L,因为小写字母l很难与数字1区分开来。

可以从int文字创建整数类型byteshortintlong的值。可以从long文字创建超出int范围的long类型的值。整数文字可以用这些数字系统表示:

  • 十进制:基数为 10,其数字由数字 0 到 9 组成;这是您每天使用的数字系统
  • 十六进制:Base 16,其数字由数字 0 到 9 和字母 A 到 F 组成
  • 二进制:基数 2,其数字由数字 0 和 1 组成(您可以在 Java SE 7 及更高版本中创建二进制文字)

对于通用编程,十进制系统可能是您将使用的唯一数字系统。但是,如果需要使用其他数字系统,以下示例将显示正确的语法。前缀0x表示十六进制,0b表示二进制:

  1. // The number 26, in decimal
  2. int decVal = 26;
  3. // The number 26, in hexadecimal
  4. int hexVal = 0x1a;
  5. // The number 26, in binary
  6. int binVal = 0b11010;

浮点文字

浮点文字的类型为float,如果它以字母Ff结尾;否则其类型为double,它可以选择以字母Dd结尾。

浮点类型(floatdouble)也可以用 E 或 e(用于科学记数法),F 或 f(32 位浮点字面量)和 D 或 d(64 位双字面值)表示;这是默认和按惯例省略)。

  1. double d1 = 123.4;
  2. // same value as d1, but in scientific notation
  3. double d2 = 1.234e2;
  4. float f1 = 123.4f;

字符和字符串文字

类型charString的文字可以包含任何 Unicode(UTF-16)字符。如果您的编辑器和文件系统允许,您可以直接在代码中使用这些字符。如果没有,您可以使用“Unicode 转义”,例如'\u0108'(带有 circumflex 的大写字母 C)或"S\u00ED Se\u00F1or"(西班牙语中的 SíSeñor)。始终对char文字使用“单引号”,对String文字使用“双引号”。 Unicode 转义序列可以在程序的其他地方使用(例如在字段名称中),而不仅仅在charString文字中使用。

Java 编程语言还支持charString文字的一些特殊转义序列:\b(退格),\t(制表符),\n(换行符),\f(换页) ,\r(回车),\"(双引号),\'(单引号)和\\(反斜杠)。

还有一个特殊的null文字,可以用作任何参考类型的值。除了基本类型的变量之外,null可以分配给任何变量。除了测试其存在外,您无法使用null值。因此,null通常在程序中用作标记,以指示某些对象不可用。

最后,还有一种称为类文字的特殊文字,通过获取类型名称并附加“.class";例如,String.class。这是指对象(类型为Class) ])代表类型本身。

在数字文字中使用下划线字符

在 Java SE 7 及更高版本中,任何数量的下划线字符(_)都可以出现在数字文字中的数字之间的任何位置。例如,此功能可用于您。分隔数字文字中的数字组,这可以提高代码的可读性。

例如,如果您的代码包含具有多个数字的数字,则可以使用下划线字符来分隔三个组中的数字,类似于使用逗号或空格等标点符号作为分隔符的方式。

以下示例显示了在数字文字中使用下划线的其他方法:

  1. long creditCardNumber = 1234_5678_9012_3456L;
  2. long socialSecurityNumber = 999_99_9999L;
  3. float pi = 3.14_15F;
  4. long hexBytes = 0xFF_EC_DE_5E;
  5. long hexWords = 0xCAFE_BABE;
  6. long maxLong = 0x7fff_ffff_ffff_ffffL;
  7. byte nybbles = 0b0010_0101;
  8. long bytes = 0b11010010_01101001_10010100_10010010;

您只能在数字之间放置下划线;你不能在下列地方放置下划线:

  • 在数字的开头或结尾
  • 与浮点文字中的小数点相邻
  • FL后缀之前
  • 在预期有一串数字的位置

以下示例演示了数字文字中有效和无效的下划线放置(突出显示):

  1. // Invalid: cannot put underscores
  2. // adjacent to a decimal point
  3. float pi1 = 3_.1415F;
  4. // Invalid: cannot put underscores
  5. // adjacent to a decimal point
  6. float pi2 = 3._1415F;
  7. // Invalid: cannot put underscores
  8. // prior to an L suffix
  9. long socialSecurityNumber1 = 999_99_9999_L;
  10. // OK (decimal literal)
  11. int x1 = 5_2;
  12. // Invalid: cannot put underscores
  13. // At the end of a literal
  14. int x2 = 52_;
  15. // OK (decimal literal)
  16. int x3 = 5_______2;
  17. // Invalid: cannot put underscores
  18. // in the 0x radix prefix
  19. int x4 = 0_x52;
  20. // Invalid: cannot put underscores
  21. // at the beginning of a number
  22. int x5 = 0x_52;
  23. // OK (hexadecimal literal)
  24. int x6 = 0x5_2;
  25. // Invalid: cannot put underscores
  26. // at the end of a number
  27. int x7 = 0x52_;