成员变量和局部变量

成员变量和局部变量

考点:

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

局部变量和成员变量的区别

1. 声明的位置

  • 局部变量: 声明在方法体中(){} 形参 代码块{}中
  • 成员变量: 类中 方法的外面-->类的属性
    • 类变量:有static修饰
    • 实例变量:没有static修饰

2. 修饰符

  • 局部变量:可以使用fianl
  • 成员变量:public protected private final static volatile teansient

3. 值存储的位置

  • 局部变量:栈(stack)
  • 成员变量:
    • 实例变量: 堆(heap)
    • 类变量: 方法区

image

  • heap:这个内存唯一的目的就是存放对象实例,几乎所有的对象都是在这里分配内存,所有的对象实例以及数组都是要在堆的上面分配的
  • stack:指的是栈,用来存储局部变量表,局部变量(表中存放了编译器间就能知道长度的各种基本的数据类型(boolean,byte,char,short,int,float,long,daoble),对象引用(reference类型,它们不等同与对象的本身,是对象在heap中的首地址)方法执行完成之后,自动释放)
  • 方法区:用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据.

4. 作用域

  • 局部变量:从声明出开始到所属的}结束
  • 成员变量
    • 实例变量:在当前类中this 有时this可以省略,在其他类中以对象名.xxx来访问
    • 类变量: 随着类的初始化而初始化,随着类的卸载而消亡,该类的所有的对象的类变量是共享的

5. 声明周期

  • 局部变量: 每一个线程,每一次调用执行都是新的生命周期
  • 成员变量:
    • 实例变量:随着对象的创建而初始化,随着对象的回收而消亡,每一个对象的实例变量都是独立的(实例变量,,顾名思义也就是在实例中的变量,在单个的实例中共享,属于属性)
    • 类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象是共享类变量的(类变量,顾名思义也就是在类中的变量,所以一个类时共享的,实例变量加上static就是类变量了)

6. 测试代码

package Other;

public class Exam5 {
    static int s;// 5
    int i; // A-2  B-1
    int j;//A-1 B-1
    {
        int i = 1;
        i++; // 就近原则 
        j++;
        s++;
    }
    public void test(int j) {
        j++; // 就近原则 21
        i++; 
        s++;
    }
    public static void main(String[] args){
        Exam5 obj1 = new Exam5();
        Exam5 obj2 = new Exam5();
        obj1.test(10);
        obj1.test(20);
        obj2.test(30);
        // 2 1 5
        System.out.println(obj1.i + "," + obj1.j + "," + obj1.s);
        // 1 1 5
        System.out.println(obj2.i + "," + obj2.j + "," + obj2.s);
    }
}

答案:
2,1,5
1,1,5

image

posted @ 2022-04-14 11:57  1_f  阅读(42)  评论(0)    收藏  举报