java中的变量
在java语言中,根据定义变量的位置不同,可以将变量分为两大类,一类是成员变量,一类是局部变量,由于二者之间存在很大的区别,所以在此介绍
1.成员变量
在类中定义的变量,分为类变量和实例变量两种,在定义类变量的时候,没有static的为实例变量,有static的为类变量。
1-1:实例变量
public class people{
//实例变量
private String name;
private int age;
}
可以由实例调用(实例.实例变量),它从该类的实例创建时开始存在,直到系统完全销毁这个实例,实例变量的作用域和对应实例的生存范围相同
1-2:类变量(由static修饰)
从该类的准备阶段开始存在,直到系统完全销毁整个类,类变量的作用域和这个类的生存范围相同
public class people{
//全局变量
private String name;
private int age;
//类变量
private static String sex;
}
1-3:比较
有无static修饰
类变量的作用域比实例变量的作用域更大
实例同样可以访问类变量(因为类变量被整个类共享),但是类不能访问实例变量
2.局部变量
2-1:形参
在定义方法签名的时候定义的变量,在整个方法内都有效
//name为形参
public void getName(String mName){
this.name=mName;
}
2-2:方法局部变量
在方法体中定义的变量,作用域是从定义该变量的地方开始 ,直到方法结束
public int addNumber(int num1,int num2){
//result为方法局部变量
int result;
result=num1+num2;
return result;
}
2-3:代码块局部变量
在代码块中定义的局部变量
public static void main(String[]args){
//代码块
{
//代码块局部变量
int a=5;
System.out.println(a);
}
}
2-4:注意事项
java中允许形参和成员变量同名,如果在方法中同名,则局部变量会覆盖成员变量的值,如果需要在方法中引用被覆盖的成员变量,可以使用this(对于实例变量)或者类名作为调用者来限定访问成员变量
//
public class People{
private String name;
public void getName(String name){
this.name=mame;
}
}
3.成员变量的初始化和运行机制
举个栗子:
class Person{
public String name;
public static int eyeNum;
}
//创建第一个对象
Person p1=new Person();
//创建第二个对象
Person p2=new Person();
//开始赋值
p1.name="a1";
p2.name="a2";
p1.eyeNum=2;
p2.eyeNum=3;
分析一下上述代码在内存中的工作情况:
首先,当程序第一次执行 Person p1=new Person();时。加载并且初始化该Person类,然后开始为它分配空间(堆中分配空间),并且指定该类属性默认的初始值,同理p2。
然后,接着在栈中创建引用对象,给堆内存中的属性(name,eyeNum)进行赋值
注:由于eyeNum被static修饰,所以为单独空间(被整个类所共享,而不属于某个对象)
4.局部变量的运行机制
4-1:局部变量需要经过显示初始化后才可以使用,在定义局部变量之后,系统没有给变量分配空间,而是等到程序给该变量赋初值时,系统才会给局部变量分配内存,并且把初始值放在内存中
4-2:局部变量不属于任何类和对象,所以它保存在所在方法的栈内存中,局部变量无需系统进行回收,一旦方法或者代码块结束,自动进行回收。