成员变量
- 定义在类中,在整个类中都可以被访问。
- 成员变量有初始默认值,基本数据类型为它本身的最小单位,而引用数据类型则为NULL。
@Data
public class Student {
private byte b;
private short s;
private int i;
private long l;
private float f;
private double d;
private char c;
private boolean boo;
private String name;
public static void main(String[] agrs) {
Student student = new Student();
System.out.println(student.getB());//0
System.out.println(student.getS());//0
System.out.println(student.getI());//0
System.out.println(student.getL());//0
System.out.println(student.getF());//0.0
System.out.println(student.getD());//0.0
System.out.println(student.getC());//默认值是空字符('\u0000')
System.out.println(student.isBoo());//false
System.out.println(student.getName());//null
}
}
- 成员变量不论是基本数据类型还是引用数据类型,都随着对象的创建而存在于堆内存当中。
- 成员变量的生命周期随着对象的创建而产生,随着对象的销毁而消失。
局部变量
- 作用在局部范围内,如:函数内,语句内等,只在所属的区域有效。
- 局部变量没有默认初始化值,声明时必须初始化默认值。
- 随着方法的执行而产生,随着方法的结束而销毁。
- 虽然当对象new出来,实体存在于堆,对象的成员变量已经在堆上分配空间,但对象里面的方法是没有出现的,只出现方法的声明,方法里面的局部变量并没有创建。等到对象调用此方法时,为了加快运行的速度,方法中的局部变量才会在栈中创建,所以,方法中的局部变量是在栈内的。注意:(引用数据类型的局部变量,声明在栈,存储在堆)。
静态变量
- 存在于方法区。
- 静态变量随着类的加载而存在,随着类的消失而消失。
- 静态变量可以被对象调用,还可以被类名调用。
- 静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。可以被多个对象共享。
@Data
public class Student {
private static int num = 20;
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student();
Student student3 = new Student();
int num1 = student1.num;
num++;
int num2 = student2.num;
num++;
System.out.println(Student.num);//22 使用类名访问。
System.out.println(student3.num);//22 使用student3对象访问。
}
}
//无论该类的哪一个对象对静态变量num进行修改,此时最后一次修改的值就是该num的最终值。并且这个最终值可以
//被该类的所有对象都访问以及操作,从而达到共享的目的。
总结
1.引用类型总是被分配到堆上。不论是成员变量还是局部变量。 2.基础类型总是分配到它声明的地方:成员变量在堆内存里,局部变量在栈内存里。 3.而静态变量则始终存在方法区当中。无论基本数据类型还是引用数据类型。