title=变量
导航 语言基础 主题: ) |
在 Java 编程语言中,字段 和 变量 是同一个东西。变量是用于存储数据的设备,例如数字或字符数据串。
Java 被认为是一种**强类型**编程语言。因此,Java 编程语言中的所有变量都应该有一个特定的**数据类型**。这要么是声明的,要么是推断的,Java 语言只允许程序在遵循类型约束的情况下运行。
如果您使用非数值类型的数据(例如文本内容)来表示数值类型,那么此类声明将违反 Java 的类型系统。这赋予了 Java **类型安全**的能力。Java 会检查表达式或数据是否以不正确的类型或根本没有类型出现。然后,它会自动在编译时将此事件标记为错误。大多数类型相关错误会被 Java 编译器捕获,因此一旦程序完全成功地编译,它就会更加安全可靠。有些语言(例如 C)对这类语句的解释进行了定义,并使用该解释而不会发出任何警告;另一些语言(例如 PL/I)对几乎所有这类语句都定义了转换,并执行转换以完成赋值。某些类型错误仍然可能在运行时发生,因为 Java 支持类型转换操作,这是一种将一个表达式的类型更改为另一种类型的操作。但是,Java 在进行此类转换时会执行运行时类型检查,因此不正确的类型转换会导致运行时异常,而不是静默地成功并允许数据损坏。
另一方面,Java 也被称为**混合语言**。虽然支持面向对象编程 (OOP),但 Java 不是像Smalltalk 或Ruby 这样的纯面向对象语言。相反,Java 提供了对象类型和基本类型。基本类型用于布尔值、字符和数值及操作。这允许在操作数值数据时获得相对较好的性能,但以灵活性的代价为代价。例如,您无法对基本类型进行子类化并向它们添加新的操作。
在 Java 编程语言中,有四种类型的变量。
代码清单 3.9: ClassWithVariables.java
public class ClassWithVariables {
public int id = 0;
public static boolean isClassUsed;
public void processData(String parameter) {
Object currentValue = null;
}
}
|
在代码清单 3.9 中,是所有四种类型变量的示例。
- **实例变量**: 这些变量用于存储对象的狀態(例如,
id
)。从类定义中创建的每个对象都将拥有自己变量的副本。它在相应的对象在内存中存在的情况下有效并占用存储空间。 - **类变量**: 这些变量在类级作用域内使用
static
修饰符显式定义(例如,isClassUsed
)。没有其他变量可以附加static
修饰符。由于这些变量使用static
修饰符定义,因此无论类实例化多少次,它们始终只有一个副本。只要类加载到内存中,它们就会一直存在。 - **参数** 或 **参数**: 这些变量传递到方法签名中(例如,
parameter
)。回想一下在 main 方法中使用args
变量的情况。它们没有附加修饰符(即public
、private
、protected
或static
),并且可以在方法中的任何地方使用。它们在方法执行期间处于内存中,并且在方法返回后无法使用。 - **局部变量**: 这些变量在方法级作用域内定义和使用(例如,
currentValue
),但不在方法签名中。它们没有任何修饰符附加到它。方法返回后,它们就不再存在。
**问题 3.5**: 考虑以下代码
问题 3.5: SomeClass.java
public class SomeClass {
public static int c = 1;
public int a = c;
private int b;
public void someMethod(int d) {
d = c;
int e;
}
}
|
在上面的例子中,我们创建了五个变量:a
、b
、c
、d
和 e
。所有这些变量都具有相同的数据类型 int
(整数)。但是,您能说出每个变量是什么类型吗?
a
和b
是**实例变量**;c
是**类变量**;d
是**参数**或**参数**; 并且,e
是**局部变量**。
变量及其存储的所有信息都保存在计算机的内存中以供访问。将计算机的内存想象成一张数据表——其中每个单元格对应一个变量。
在创建变量时,我们基本上会创建一个新的地址空间并为其指定一个唯一的名称。Java 进一步允许您定义可以在变量中放置的内容——用 Java 的术语来说,您称之为*数据类型*。因此,要创建变量,您基本上需要做两件事
- 通过为变量指定一个唯一的名称来创建变量; 并且,
- 为变量定义一个数据类型。
以下代码演示了如何创建一个简单的变量。此过程称为*变量声明*。
代码部分 3.40: 一个简单的变量声明。
int a;
|
由于我们为变量提供了数据类型,因此我们知道变量可以保存什么,不能保存什么。我们知道 int
(整数)数据类型支持正整数或负整数。因此,一旦变量创建完毕,我们就可以使用以下语法为它提供任何整数值。此过程称为*赋值操作*。
代码部分 3.41: 变量声明和赋值操作(在不同的行上)。
int a;
a = 10;
|
Java 为程序员提供了一种更简单的方法,可以将变量声明和赋值操作组合在一行中。考虑以下代码
代码部分 3.42: 变量声明和赋值操作(在同一行上)。
int a = 10;
|
考虑以下代码
代码部分 3.43: 未分组的声明。
int a;
int b;
String c;
a = 10;
b = 20;
c = "some text";
|
您可以通过多种方式来简化此代码的编写。例如,您可以将类似数据类型的声明分组在一个语句中
代码部分 3.44: 分组声明。
int a, b;
String c;
a = 10;
b = 20;
c = "some text";
|
或者,您可以通过将分组声明和赋值组合在一起进一步简化语法,例如
代码部分 3.45: 分组声明和赋值。
int a = 10, b = 20;
String c = "some text";
|
虽然地址空间 有自己的地址——通常是哈希数字,例如 0xCAD3
等——但是,如果我们能够为变量指定一个可识别的名称,那么记住变量在内存中的位置会容易得多。**标识符**是我们为变量指定的名称。您可以将变量命名为任何名称,例如 aVariable
、someVariable
、age
、someonesImportantData
等。但是请注意:我们描述的这些名称中都没有空格。因此,很明显,变量名称中不允许出现空格。事实上,在变量名称中还有很多其他不允许出现的东西。允许出现的东西包括
- 字符
A
到Z
及其小写形式a
到z
。 - 数字
0
到9
。但是,数字不能出现在变量名称的开头。 - 最后,特殊字符,其中只包括
$
(美元符号)和_
(下划线)。
**问题 3.6**: 以下哪个是正确的变量标识符?
f_name
lastname
someones name
$SomeoneElsesName
7days
TheAnswerIs42
我可以告诉你 3 和 5 不是在这里做事的方法,其余都是正确的标识符。
任何有效的变量名称都可能是正确的,但并非总是你应该用于变量的名称,原因如下
- 变量的名称应该反映它们内部的值。
- 标识符的命名应该遵循命名指南或约定。我们将在稍后进行说明。
- 标识符不应该是一个无意义的名称,例如
lname
,你应该始终正确地命名它:lastName
是为变量命名的最佳方法。
在为标识符命名时,您需要使用以下指南,以确保变量的命名准确。正如我们之前所讨论的,我们应该始终以一种能够告诉我们它们保存什么的方式来命名我们的变量。考虑以下示例
代码部分 3.46: 未知过程。
int a = 24;
int b = 365;
int c = a * b;
|
你知道这个程序是做什么的吗?嗯,它把两个值相乘。这一点你猜对了。但是,你知道这两个值是什么吗?确切地说,你不知道。现在看看这段代码
代码节 3.47:时间转换。
int age = 24;
int daysInYear = 365;
int ageInDays = age * daysInYear;
|
现在你可以说出发生了什么事了,不是吗?然而,在我们继续之前,请注意变量的大小写。如果一个词包含大写字母,则它处于大写状态。如果一个词包含小写字母,则它处于小写状态。一个词中同时出现大写和小写字母则被认为是混合大小写。
我们到目前为止学习的变量都是混合大小写。当有两个或多个词组成变量名时,你需要使用一种叫做驼峰式命名法的特殊大小写。就像骆驼的驼峰一样,你的单词需要突出显示。使用这种技术,first
和 name
可以写成 firstName
或 FirstName
。
第一个实例,firstName
是我们用作变量名的。不过请记住,firstName
与 FirstName
不同,因为 Java 是区分大小写的。区分大小写基本上意味着你在写一个词时的字母大小写必须与你在后面使用它时的大小写一致。任何其他方式都与你的意图不符。随着你的学习,你会了解更多。你现在应该明白为什么你被要求识别的变量不正确了。
字面量(值)
[edit | edit source]现在我们知道了变量应该如何命名,让我们来看看这些变量的值。像数字这样的简单值被称为字面量。本节将向你展示字面量是什么以及如何使用它们。请看下面的代码
代码节 3.48:字面量。
int age = 24;
long bankBalance = 20000005L;
|
到目前为止,我们只看到了数字如何在赋值语句中工作。让我们看看除了数字以外的其他数据类型。字符基本上是英文字母表中的字母。在写单个字符时,我们使用单引号将其括起来。请看下面的代码
代码节 3.49:字符。
char c = 'a';
|
你问为什么?嗯,解释很简单。如果在没有引号的情况下写,系统会认为它是一个变量标识符。这就是你在区分变量及其字面量值时必须做出的区分。字符数据类型有点不寻常。首先,它们只能保存单个字符。如果你需要在其中存储一个完整的姓名,比如John,你会这样写吗?
代码节 3.50:字符列表。
char firstChar = 'J';
char secondChar = 'o';
char thirdChar = 'h';
char fourthChar = 'n';
|
现在,这太糟糕了。谢天谢地,有一种数据类型可以处理大量的字符,它叫做String
。字符串可以像下面这样初始化
代码节 3.51:字符串。
String name = "John";
|
注意,使用双引号而不是单引号。这是你需要注意的唯一一件事。