一. Java中变量的分类
Java中变量根据声明位置不同可以分为:局部变量和成员变量,成员变量如果使用static关键字修饰又称为静态成员变量,如果没有static修饰又称为实例成员变量。下面分别阐述一下他们三者之间联系和区别。
public class Variable {
//静态成员变量(静态变量)
static int x=10;
//实例成员变量(成员变量)
int y=20;
public static void main(String[] args) {
//局部变量
int num=30;
}
}
二 .局部变量、成员变量、静态变量三者的区别
变量 | 声明位置 | 内存位置 | 生命周期 | 初始化 |
---|---|---|---|---|
局部变量 | 方法中或方法声明上(形参) | 栈 | 随着方法的调用而创建,随着方法的消失而消失 | 初始化必须赋值 |
实例变量 | 类中方法外 | 堆 | 随着对象的创建而创建,随着对象的消失而消失 | 有默认初始化值 |
静态变量 | 类中方法外 | 方法区的静态区 | 随着类的加载而加载,随着类的消失而消失 | 有默认初始化 |
什么时候使用静态变量?
当一个类的所有对象的某个“属性值”不会随着对象的改变而变化时,为了节省堆内存,我们可以将该属性定义为类级别的属性,也就是声明为静态变量,上升为“整个族”的数据,这样的变量不需要创建对象直接使用“类名”即可访问。
成员变量 | 表面区别 | 使用场景 | 调用方法 | 内存位置 |
---|---|---|---|---|
实例变量 | 无static修饰 | 对于类中每个对象都是特有的属性 | 只能通过对象名调用 | 堆区 |
静态变量 | 被static修饰 | 对于类中每个对象一致的属性 | 可以使用类名调用,也可以使用对象名调用(不推荐) | 方法区的静态区 |
举例:
public class ManTest {
public static void main(String[] args) {
Man man=new Man("小明");
//实例变量使用对象名调用
System.out.println("名字"+man.name);
//静态变量可使用类名调用(推荐)
System.out.println("性别"+Man.sex);
//静态变量也可以通过对象名调用(不推荐)
System.out.println("性别"+man.sex);
}
}
class Man{
//实例变量
String name;
//静态变量
static char sex='男';
Man(){
}
Man(String name) {
this.name = name;
}
}
几点注意
- 就近原则
局部变量和成员变量名称一致时,在方法中使用,采用的是就近原则。 - 作用域
同一个域中变量名不能重名,不同的域变量名可以相同,java遵循就近原则会自动访问离他最近的数据。
关于变量的有效范围,我们记住一句话:出了大括号就不认识了。