在 Java 语言中,所有的变量在使用前必须声明。
声明变量的基本格式如下:
格式说明:
以下列出了一些变量的声明实例。注意有些包含了初始化过程。
Java 语言支持的变量类型有:
public void exampleMethod() { int localVar = 10; // 局部变量 // ... }
public class ExampleClass { int instanceVar; // 实例变量 }
public class ExampleClass { static int classVar; // 类变量 }
public void exampleMethod(int parameterVar) { // 参数变量 // ... }
以下实例中定义了一个 RunoobTest 类,其中包含了一个成员变量 instanceVar 和一个静态变量 staticVar。
method() 方法中定义了一个参数变量 paramVar 和一个局部变量 localVar。在方法内部,我们将局部变量的值赋给成员变量,将参数变量的值赋给静态变量,然后打印出这些变量的值。
在 main() 方法中,我们创建了一个 RunoobTest 对象,并调用了它的 method() 方法。
实例
运行以上代码,输出如下:
成员变量: 10 静态变量: 20 参数变量: 20 局部变量: 10
Java 参数变量
Java 中的参数变量是指在方法或构造函数中声明的变量,用于接收传递给方法或构造函数的值。参数变量与局部变量类似,但它们只在方法或构造函数被调用时存在,并且只能在方法或构造函数内部使用。
Java 方法的声明语法如下:
accessModifier returnType methodName(parameterType parameterName1, parameterType parameterName2, ...) { // 方法体 }
在调用方法时,我们必须为参数变量传递值,这些值可以是常量、变量或表达式。
方法参数变量的值传递方式有两种:值传递和引用传递。
以下是一个简单的例子,展示了方法参数变量的使用:
a = 10, b = 20
Java 局部变量
Java 的局部变量是在方法、构造方法或语句块内部声明的变量,其作用域限制在声明它的代码块内部。
局部变量的声明语法为:
type variableName;
说明:
以下是一个简单的例子,展示了局部变量的使用:
以上实例中我们声明并初始化了两个局部变量 a 和 b,然后打印出它们的值。注意,如果在使用局部变量之前不初始化它,编译器会报错。
在以下实例中 age 是一个局部变量,定义在 pupAge()方法中,它的作用域就限制在这个方法中:
以上实例编译运行结果如下:
小狗的年龄是: 7
在下面的例子中 age 变量没有初始化,所以在编译时会出错:
Test.java:4:variable number might not have been initialized age = age + 7; ^ 1 error
成员变量(实例变量)
成员变量的声明语法为:
accessModifier type variableName;
与局部变量不同,成员变量的值在创建对象时被分配,即使未对其初始化,它们也会被赋予默认值,例如 int 类型的变量默认值为 0,boolean 类型的变量默认值为 false。
成员变量可以通过对象访问,也可以通过类名访问(如果它们是静态成员变量)。如果没有显式初始化成员变量,则它们将被赋予默认值。可以在构造函数或其他方法中初始化成员变量,或者通过对象或类名访问它们并设置它们的值。
以下实例我们声明了两个成员变量 a 和 b,并对其进行了访问和设置。注意,我们可以通过对象访问成员变量,也可以通过类名访问静态成员变量。
a = 10 b = World
以下实例我们声明了两个成员变量 name 和 salary,并对其进行了访问和设置。
Employee.java 文件代码:
$ javac Employee.java $ java Employee 名字 : RUNOOB 薪水 : 1000.0
类变量(静态变量)
Java 中的静态变量是指在类中定义的一个变量,它与类相关而不是与实例相关,即无论创建多少个类实例,静态变量在内存中只有一份拷贝,被所有实例共享。
静态变量在类加载时被创建,在整个程序运行期间都存在。
定义方式
静态变量的定义方式是在类中使用 static 关键字修饰变量,通常也称为类变量。
以下实例中我们定义一个静态变量 count ,其初始值为 0:
访问方式
由于静态变量是与类相关的,因此可以通过类名来访问静态变量,也可以通过实例名来访问静态变量。
生命周期
静态变量的生命周期与程序的生命周期一样长,即它们在类加载时被创建,在整个程序运行期间都存在,直到程序结束才会被销毁。因此,静态变量可以用来存储整个程序都需要使用的数据,如配置信息、全局变量等。
初始化时机
静态变量在类加载时被初始化,其初始化顺序与定义顺序有关。
如果一个静态变量依赖于另一个静态变量,那么它必须在后面定义。
上面的例子中,count1 要先于 count2 初始化,否则编译时会报错。
常量和静态变量的区别
常量也是与类相关的,但它是用 final 关键字修饰的变量,一旦被赋值就不能再修改。与静态变量不同的是,常量在编译时就已经确定了它的值,而静态变量的值可以在运行时改变。另外,常量通常用于存储一些固定的值,如数学常数、配置信息等,而静态变量通常用于存储可变的数据,如计数器、全局状态等。
总之,静态变量是与类相关的变量,具有唯一性和共享性,可以用于存储整个程序都需要使用的数据,但需要注意初始化时机和与常量的区别。
静态变量的访问修饰符
静态变量的访问修饰符可以是 public、protected、private 或者默认的访问修饰符(即不写访问修饰符)。
需要注意的是,静态变量的访问权限与实例变量不同,因为静态变量是与类相关的,不依赖于任何实例。
静态变量的线程安全性
Java 中的静态变量是属于类的,而不是对象的实例。因此,当多个线程同时访问一个包含静态变量的类时,需要考虑其线程安全性。
静态变量在内存中只有一份拷贝,被所有实例共
享。因此,如果一个线程修改了静态变量的值,那么其他线程在访问该静态变量时也会看到修改后的值。这可能会导致并发访问的问题,因为多个线程可能同时修改静态变量,导致不确定的结果或数据一致性问题。
为了确保静态变量的线程安全性,需要采取适当的同步措施,如同步机制、原子类或 volatile 关键字,以便在多线程环境中正确地读取和修改静态变量的值。
静态变量的命名规范
静态变量(也称为类变量)的命名规范通常遵循驼峰命名法,并且通常使用全大写字母,单词之间用下划线分隔,并且要用 static 关键字明确标识。
静态变量的使用场景
静态变量通常用于以下场景:
以下实例定义了一个 AppConfig 类,其中包含了三个静态变量 APP_NAME、APP_VERSION 和 DATABASE_URL,用于存储应用程序的名称、版本和数据库连接URL。这些变量都被声明为 final,表示它们是不可修改的常量。
在 main() 方法中,我们打印出了这些静态变量的值。
AppConfig.java 文件代码:
Application name: MyApp Application version: 1.0.0 Database URL: jdbc:mysql://localhost:3306/mydb
可以看到,这些静态变量存储的全局配置信息可以在整个程序中使用,并且不会被修改。这个例子展示了静态变量的另一个常见应用,通过它我们可以很方便地存储全局配置信息,或者实现其他需要全局共享的数据。
以下实例定义了一个 Counter 类,其中包含了一个静态变量 count,用于记录创建了多少个 Counter 对象。
每当创建一个新的对象时,构造方法会将计数器加一。静态方法 getCount() 用于获取当前计数器的值。
在 main() 方法中,我们创建了三个 Counter 对象,并打印出了计数器的值。
Counter.java 文件代码:
目前为止创建的对象数: 3
可以看到,计数器记录了创建了三个对象。这个例子展示了静态变量的一个简单应用,通过它我们可以很方便地统计对象的创建次数,或者记录其他需要全局共享的数据。
本章节中我们学习了Java的变量类型,下一章节中我们将介绍Java修饰符的使用。