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修饰,所以为单独空间(被整个类所共享,而不属于某个对象)

 

java类的成员变量有哪些 java中类变量和成员变量_类变量

4.局部变量的运行机制

4-1:局部变量需要经过显示初始化后才可以使用,在定义局部变量之后,系统没有给变量分配空间,而是等到程序给该变量赋初值时,系统才会给局部变量分配内存,并且把初始值放在内存中

4-2:局部变量不属于任何类和对象,所以它保存在所在方法的栈内存中,局部变量无需系统进行回收,一旦方法或者代码块结束,自动进行回收。