• 就近原则
  • 变量的分类
    • 成员变量:类变量、实例变量
    • 局部变量
  • 非静态代码块的执行:每次创建实例对象都会执行
  • 方法的调用规则:调用一次执行一次

一、代码演示

老规矩先上代码

  1. public class Demo02 {
  2. static int s; // 成员变量--类变量
  3. int i; // 成员变量--实例变量
  4. int j; // 成员变量--实例变量
  5. {
  6. int i = 1; // 非静态代码块中的局部变量i
  7. i++;
  8. j++;
  9. s++;
  10. }
  11. public void test(int j) { // 形参,局部变量,j
  12. j++;
  13. i++;
  14. s++;
  15. }
  16. public static void main(String[] args) { // 形参,局部变量 args
  17. Demo02 obj1 = new Demo02(); // 局部变量,obj1 i=0,j=1,s=1
  18. Demo02 obj2 = new Demo02(); // 局部变量,obj2 i=0,j=1,s=2
  19. obj1.test(10); // i=1,j=1,s=3
  20. obj1.test(20); // i=2,j=1,s=4
  21. obj2.test(30); // i=1,j=1,s=5
  22. System.out.println(obj1.i + "," + obj1.j + "," + obj1.s);
  23. System.out.println(obj2.i + "," + obj2.j + "," + obj2.s);
  24. }
  25. }
  26. 运行结果:
  27. 2,1,5
  28. 1,1,5

二、成员变量与局部变量的区别

2.1 声明位置

  • 局部变量:方法体 { } 中,形参,代码块 { } 中
  • 成员变量:类中方法外

    • 类变量:有static修饰
    • 实例变量:没有static修饰

      2.2 作用

  • 成员变量的作用是用于描述一类事物的公共 属性的。

  • 局部变量的作用就是提供一个变量给方法内部使用而已。

    2.3 初始值区别

  • 成员变量是有默认的初始值

    1. 数据类型 默认的初始值<br /> int 0<br /> float 0.0f<br /> double 0.0<br /> boolean false<br /> char ' '<br /> String(引用数据类型) null
  • 局部变量是没有默认的初始值的,必须要先初始化才能使用。

    2.4 值存储位置

  • 局部变量:栈

  • 实例变量:堆
  • 类变量:方法区

image.png

堆(heap):存储对象实例,和数组 栈(stack):虚拟机栈。用于存储局部变量表。局部变量表存放了编译期可以知道长度的各种基本数据类型(boolean、byte、short、char、int、float、long、double)、对象引用(reference类型,存储对象在堆内存的首地址)。方法执行完自动释放。 方法区(Method Area)用于存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。
注:jdk8之后,常量、静态常量放到了堆当中。

例如Demo02 obj1 = new Demo02(),obj1在栈里面,new Demo02()在堆里面

2.5 生命周期

  • 局部变量:每一个线程,每一次调用执行都是新的生命周期
  • 实例变量:随着对象的创建而创建,随着对象的回收而消亡,每一个对象的实例变量都是独立的。
  • 类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的。

image.png