文档

Java™ 教程-Java Tutorials 中文版
基本数据类型
Trail: Learning the Java Language
Lesson: Language Basics
Section: Variables

基本数据类型

Java 编程语言是静态类型的,这意味着所有变量必须先声明才能使用。这包括说明变量的类型和名称,正如你已经看到的那样:

int gear = 1;

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

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

默认值

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

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

数据类型 默认值(对于字段)
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
String(或任何对象)   null
boolean false

局部变量略有不同;编译器从不将默认值分配给未初始化的局部变量。如果你不能初始化声明它的局部变量,确保在你尝试使用它之前给它赋值。访问未初始化的本地变量将导致编译时错误。

Literals(字面量)

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

boolean result = true;
char capitalC = 'C';
byte b = 100;
short s = 10000;
int i = 100000;

整数字面量

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

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

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

// The number 26, in decimal
int decVal = 26;
//  The number 26, in hexadecimal
int hexVal = 0x1a;
// The number 26, in binary
int binVal = 0b11010;

浮点字面量

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

浮点类型(floatdouble)也可以用 E 或 e(科学记数法),F 或 f(32 位 float 字面量)和 D 或 d(64 位double 字面量;这是默认值,按照规范被省略)。

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

字符和字符串字面量

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

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

还有一个特殊的 null 字面量,可以用作任何引用类型的值。可以将 null 分配给任何变量,但基本类型的变量除外。对于 null 值,除了测试它的存在之外,几乎没有别的可做的。因此,null 通常在程序中用作标记来指示某个对象不可用。

最后,还有一种特殊类型的字面量,称为 class literal,通过取一个类型名称并加上 ".class";例如 String.class。这指的是表示类型本身的对象(类型 Class)。

在数字字面量中使用下划线字符

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

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

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

long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi =  3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;

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

以下示例演示了数字字面量中的有效和无效(高亮显示)的下划线布局:

// Invalid: cannot put underscores
// adjacent to a decimal point
float pi1 = 3_.1415F;
// Invalid: cannot put underscores 
// adjacent to a decimal point
float pi2 = 3._1415F;
// Invalid: cannot put underscores 
// prior to an L suffix
long socialSecurityNumber1 = 999_99_9999_L;

// OK (decimal literal)
int x1 = 5_2;
// Invalid: cannot put underscores
// At the end of a literal
int x2 = 52_;
// OK (decimal literal)
int x3 = 5_______2;

// Invalid: cannot put underscores
// in the 0x radix prefix
int x4 = 0_x52;
// Invalid: cannot put underscores
// at the beginning of a number
int x5 = 0x_52;
// OK (hexadecimal literal)
int x6 = 0x5_2; 
// Invalid: cannot put underscores
// at the end of a number
int x7 = 0x52_;

Previous page: Variables
Next page: Arrays