Java(10)成员变量和局部变量

Posted on   弯弓射雕的男人  阅读(78)  评论(0编辑  收藏  举报

1、声明的位置
    局部变量:方法体{}中,形参,代码块中
    成员变量:类中方法外
          ①、类变量:有static修饰
          ②、实例变量:没有static修饰
  2、修饰符
     局部变量:final
     成员变量:public private protected final static volatile transient
  3、值存储的位置
     局部变量:栈
     实例变量:堆
     类变量:方法区
  4、作用域
     局部变量:从声明处开始,到所属“}”结束
     实例变量:在当前类中用“this.”(有时this.省略)访问,在其他类中用“对象名.”访问
     类变量:在当前类中用“类名.”(有时类名.省略)访问,在其他类中用“类名.”或“对象名.”访问
   5、生命周期
     局部变量:每一个线程,每一次调用都会有新的生命周期
     实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例变量是独立的
     类变量:随着类的初始化而初始化,,随着类的卸载而消亡,该类的所有对象的类变量是共享的

 

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

 

执行流程:    

   就近原则

  ①、main方法所在类需要先加载和初始化:执行类初始化(静态变量和静态代码块),static int s =0,成员变量的类变量,存放在方法区,共享

  ②、实例初始化:Exam5 obj1 = new Exam5() 

      栈中存储obj1,存储指向堆中实例的地址,堆中存储Exam5()对象本身,执行的是obj1的<init>()
      <1>、非静态类变量显示赋值代码:int i=0; int j=0;成员变量的实例变量,存储在堆中,同对象实例存储在一起
      <2>、非静态代码块:int i = 1;局部变量,存储在栈中;i++;就近原则,是非静态代码块中的i自增,故栈中的i=2;
                j++;就近原则,是刚创建的实例对象中的j自增,故obj1指向的实例对象中的j=1;
                s++;就近原则,是类初始化的成员变量(类变量)中的s自增,故方法区中的s=1;
      <3>、构造器,该类未对构造器做任何操作
        运行结束,局部变量i的生命周期结束,释放掉栈中的i=2
  ③、实例初始化:Exam5 obj2 = new Exam5() 
      栈中存储obj2,存储指向堆中实例的地址,堆中存储Exam5()对象本身,执行的是obj1的<init>()
      <1>、非静态类变量显示赋值代码:int i=0; int j=0;成员变量的实例变量,存储在堆中,同对象实例存储在一起
      <2>、非静态代码块:int i = 1;局部变量,存储在栈中;i++;就近原则,是非静态代码块中的i自增,故栈中的i=2;
                j++;就近原则,是刚创建的实例对象中的j自增,故obj1指向的实例对象中的j=1;
                s++;就近原则,是类初始化的成员变量(类变量)中的s自增,故方法区中的s=2;
      <3>、构造器,该类未对构造器做任何操作
        运行结束,局部变量i的生命周期结束,释放掉栈中的i=2
   ④、obj1.test(10);
      执行test(int j)方法,int j是形参,局部变量,存储在栈中,j=10;
      j++;就近原则,是栈的j自增,故栈中的j=11;
      i++;就近原则,就近原则,是obj1的实例对象中的i自增,故obj1指向的实例对象中的i=1;
      s++;就近原则,是类初始化的成员变量(类变量)中的s自增,故方法区中的s=3;
        运行结束,局部变量j的生命周期结束,释放掉栈中的j=11
   ⑤、obj1.test(20);
      执行test(int j)方法,int j是形参,局部变量,存储在栈中,j=20;
      j++;就近原则,是栈的j自增,故栈中的j=21;
      i++;就近原则,就近原则,是obj1的实例对象中的i自增,故obj1指向的实例对象中的i=2;
      s++;就近原则,是类初始化的成员变量(类变量)中的s自增,故方法区中的s=4;
        运行结束,局部变量j的生命周期结束,释放掉栈中的j=21
   ⑥、obj2.test(30);
      执行test(int j)方法,int j是形参,局部变量,存储在栈中,j=30;
      j++;就近原则,是栈的j自增,故栈中的j=21;
      i++;就近原则,就近原则,是obj2的实例对象中的i自增,故obj2指向的实例对象中的i=1;
      s++;就近原则,是类初始化的成员变量(类变量)中的s自增,故方法区中的s=5;  
        运行结束,局部变量j的生命周期结束,释放掉栈中的j=11
   ⑦、obj1.i为堆中实例对象所包涵的i,此时i=2;
     obj1.j为堆中实例对象所包含的j,此时j=1;
     obj1.s为方法区中共享的s,此时s=5;
     obj2.i为堆中实例对象所包涵的i,此时i=1;
     obj2.j为堆中实例对象所包含的j,此时j=1;
     obj2.s为方法区中共享的s,此时s=5;
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示