1. 概述

在使用Java编程语言时,我们会大量使用字面量。本教程将探讨所有类型的字面量以及如何使用它们。

2. 什么是Java字面量?

Java字面量是在代码中指定的常量值。 它可以是任何类型——整数、浮点数、双精度数、长整型、字符串、字符或布尔值。

下面的例子中,数字1和字符串literal_string就是字面量。

int x = 1;
String s = "literal_string";

在处理字面量时,理解Java基本类型同样重要。

3. 字面量类型

让我们来看看不同类型字面量的一些示例。

3.1. 整数字面量

对于整数类型(如int、long、short和byte),我们有多种表示方式。

首先,我们可以使用十进制字面量(基数10),这是最常见的,因为我们日常使用的都是这种形式。

int x = 1;

其次,我们可以使用八进制形式(基数8)。在这种形式下,它们必须以0开头。

int x = 05;

第三,整数字面量也可以用十六进制形式(基数16)表示。它们必须以0x0X开头。

int x = 0x12ef;

最后,我们有二进制形式(基数2)。这种形式在Java 1.7中引入,字面量必须以0b0B开头。

int x = 0b1101;

在上述例子中,只要字面值不超过类型限制,我们可以将int替换为任何整数类型。这些字面量默认被视为int。对于longshortbyte,编译器会检查值是否符合类型的限制,如果符合,就会将其视为相应类型的字面量。

要覆盖默认的int字面量,对于长整型字面量,我们可以使用lL。只有当字面值超过int限制时,才需要这样做。

3.2. 浮点数字面量

浮点数字面量默认被视为double。我们也可以通过使用dD指定它是double。虽然这不是强制性的,但这是一个好习惯。

要指定一个float,我们可以使用fF。对于float类型的字面量,这是必需的。

浮点数字面量只能以十进制形式(基数10)指定:

double d = 123.456;
float f = 123.456;
float f2 = 123.456d;
float f3 = 123.456f;

第二个和第三个例子由于类型不匹配而无法编译。

3.3. 字符字面量

对于char数据类型,字面量有几种表示方式。

单引号中的字符很常见,特别适用于特殊字符。

char c = 'a';
char c2 = '\n';

我们可以只使用单个字符或单引号中的一个特殊字符

用于字符的整数值会被转换为其对应字符的Unicode值:

char c = 65;

我们可以像整数字面量那样来表示它。

最后,我们可以使用Unicode表示法:

char c= '\u0041';

最后两个例子中的表达式会计算字符A的值。

3.4. 字符串字面量

任何双引号之间的文本都是一个String字面量:

String s = "string_literal";

String字面量只能在一行内。要创建多行String,我们需要使用一个会在编译时执行的表达式:

String multiLineText = "When we want some text that is on more than one line,\n"
+ "then we can use expressions to add text to a new line.\n";

4. shortbyte字面量

上面我们已经看到了声明各种类型字面量的方式。除了byteshort之外,其他类型我们不需要先创建变量,可以直接使用字面值。

例如,在调用方法时,我们可以直接传递字面值:

static void literals(int i, long l, double d, float f, char c, String s) {
    // do something
}
//Call literals method
literals(1, 123L, 1.0D, 1.0F, 'a', "a");

对于这些类型,没有特定的表示符号,所以它们不会作为默认类型使用。在上述例子中,F是必需的标记。

令人惊讶的是,对于byteshort类型,会出现问题:

static void shortAndByteLiterals(short s, byte b) {
    // do something
}
//Call the method
shortAndByteLiterals(1, 0); // won't compile

尽管有这个限制,我们有两个解决方案。

第一个解决方案是使用之前已声明的变量:

short s = 1;
byte b = 1;
shortAndByteLiterals(s, b);

另一个选择是将字面值转换为类型:

shortAndByteLiterals((short) 1, (byte) 0);

这样做的目的是让编译器使用适当的类型。

5. 总结

在这篇文章中,我们探讨了在Java中指定和使用字面量的不同方式。