1. 什么是成员变量?什么是局部变量?
局部变量 和成员变量 是两种常见的变量类型,它们在作用域、生命周期、初始化等方面有显著的区别。理解这两者的区别对于编写清晰和高效的 Java 程序至关重要。
-
创建局部变量,然后打印局部变量:
```java
public static void main(String[] args){
String brand; // 品牌
String color ; // 颜色
int memory; // 内存
System.out.println("brand:"+ brand);
System.out.println("color:"+ color);
System.out.println("memory:"+ memory);}
```
不初始化就会报错 。
-
创建一个类,在类中创建成员变量,然后创建对象,打印出对象的成员变量:
```java
public class Phone {
String brand; // 品牌
String color ; // 颜色
int memory; // 内存// 程序的开始 public static void main(String[] args){ Phone p = new Phone(); System.out.println("brand:"+ p.brand); System.out.println("color:"+p.color); System.out.println("memory:"+p.memory); }
}
```
不初始化,而打印出了值 。
通过上述的两个测试,我们可以发现,在类中创建的成员变量有默认值,即,成员变量不用初始化就会有一个值,而局部变量必须手动赋值。
2. 成员变量
2.1 定义和特点
成员变量是类中的字段(属性),它们是类的组成部分。
成员变量有两种类型 :
- 实例变量 (Instance Variables):属于类的实例(对象),每个对象有一份独立的实例变量。
- 类变量 (Class Variables):使用 static 关键字声明,属于类本身,而不是类的任何实例。
2.2 实例变量
- 实例变量是类中定义的字段,每个类的实例(对象)都有自己的实例变量副本。
- 实例变量在对象创建时被分配内存,每个对象都有独立的实例变量。
- 实例变量具有默认值:如果未显式初始化,实例变量会根据其类型自动赋予默认值(例如,int 类型默认为 0,boolean 默认为 false,对象引用类型默认为 null)。
- 实例变量在类的实例化期间存在,当对象被销毁时,实例变量也会被销毁。
示例:
```java
public class Example {
private int x; // 实例变量 默认值为0
public void printX() {
System.out.println(x); // 访问实例变量
}
}
```
在这个例子中,x
是实例变量。每当你创建一个 Example
对象时,都会为每个对象分配一个 x 变量,并且每个对象有自己的 x 值。
2.3 类变量
- 类变量使用 static 关键字声明,它们属于类本身,而不是类的实例。
- 类变量在类加载时就会被初始化,并且所有类的实例共享同一个类变量。
- 类变量有默认值,如果未显式初始化,它们也会被赋予默认值(与实例变量相同)。
示例:
```java
public class Example {
static int count; // 类变量
public void increment() {
count++; // 访问类变量
}
}
```
在这个例子中,count
是类变量。所有Example
类的实例共享同一个 count 变量,类变量在类加载时初始化。
2.4 成员变量的默认值
数据类型 | 默认值 |
---|---|
byte | 0 |
char | ‘\u0000’ |
short | 0 |
int | 0 |
long | 0L |
boolean | false |
float | 0.0f |
double | 0.0 |
reference | null |
3. 局部变量
3.1 定义和特点
- 局部变量是在方法、构造方法、或者代码块内定义的变量。
- 局部变量的作用域仅限于它们被声明的代码块或方法。
- 局部变量没有默认值,必须在使用前初始化。
- 局部变量的生命周期从其定义开始,到方法或者代码块执行完毕时结束。换句话说,局部变量只存在于方法或代码块的执行过程中,一旦方法返回或代码块执行完毕,局部变量会被销毁。
3.2 示例和说明
```java
public class Example {
public void myMethod() {
int x = 10; // x 是局部变量 必须要被初始化
System.out.println(x); // 可以使用局部变量
}
}
```
在这个例子中,x
是局部变量,它只在 myMethod()
方法内部存在。当方法执行完毕,x
会被销毁。
关键特点 :
- 作用域:局部变量的作用域限制在其所在的方法、构造方法或代码块内。
- 初始化:局部变量在使用前必须被显式初始化。否则,编译器会报错。
- 生命周期:局部变量的生命周期是方法或者代码块的执行周期,即方法/代码块开始执行时创建,结束时销毁。
注意事项 :
- 局部变量的作用域仅限于方法内,因此它不能被方法外部访问。
- 局部变量不能声明为 static,因为它的生命周期与方法的调用有关,而不是与类的实例或类本身的生命周期有关。
4. 局部变量 vs 成员变量
特性 | 局部变量 | 成员变量 (实例变量/类变量) |
---|---|---|
定义位置 | 方法、构造器、代码块中 | 类中,方法外 |
初始化 | 必须显式初始化 | 会自动初始化为默认值(实例变量/类变量) |
作用域 | 仅限于所在的方法/代码块 | 实例变量:限于对象;类变量:限于类 |
生命周期 | 方法/代码块执行期间 | 实例变量:对象的生命周期;类变量:类的生命周期 |
访问修饰符 | 无法使用访问修饰符 | 可以使用访问修饰符 public 、private 等 |
是否与类相关 | 无 | 实例变量与对象相关;类变量与类本身相关 |
静态关键字 | 不可以是 static |
类变量必须是 static |
局部变量 :只在方法、构造方法、或代码块内有效,必须显式初始化,并且生命周期仅限于方法或代码块执行时。
成员变量 :包括实例变量和类变量,实例变量属于对象,类变量属于类,成员变量有默认值,生命周期较长,且可以使用访问修饰符来控制访问权限。