成员变量和局部变量详解

成员变量和局部变量详解好吧 我承认我有赌的成分 我以为我能赌出答案 结果赌输了 还得利用 JVM 的知识点进行运算 文章目录 1 考点 2 局部变量和成员变量的区别 3 具体的测试代码 4 过程分析 重点 5 补充 1 考点 就近原则变量的分类成员变量 类变量 实例变量局部变量非静态代码块的执行 每次执行实例对象都会执行方法的调用规则 调用一次执行一次 2 局部变量和成员变量的区别 1 声明位置局部变量 方法体 中 形参 代码块 中成员变量 类中方法外类变量 有 static 修饰实例


1、考点:

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

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

1、声明位置

  1. 局部变量:方法体{}中、形参、代码块{}中
  2. 成员变量:类中方法外
    • 类变量:有static修饰
    • 实例变量:没有static修饰

2、修饰符

  1. 局部变量:final
  2. 成员变量:public、protect、private、final、static、volatile、transient(序列化)

3、存储位置:

  1. 局部变量:栈
  2. 实例变量:堆
  3. 类变量:方法区

4、作用域

  1. 局部变量:从声明处开始,到所属的 } 结束
  2. 实例变量:在当前类中 “this.” (有时this.可以省略),在其他类中 “对象名.” 访问
  3. 类变量:在当前类中 “类名.” (有时类名. 可以省略),在其他类中“类名.” 或 “对象名.” 访问

5、生命周期

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

补充:

堆(Heap):

此内存区域的唯一目的就是存放实例对象,几乎所有的实例对象都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配

栈(Stack):

通常说的栈是指虚拟机栈。虚拟机栈用于存储局部变量表等。局部变量表存放了编译期可知长度的各种基本数据类型(8大基本数据类型)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。方法执行完,自动释放。

方法区(Method Area):

用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据


3、具体的测试代码

测试代码:

package pers.mobian.questions06; public class Test01 { 
          static int s;//成员变量,类变量 int i;//成员变量,实例变量 int j;//成员变量,实例变量 { 
          int i = 1; //局部变量 i++; //局部变量 如果此处想要成为成员变量,就需要在变量前面添加一个this关键字 j++; //成员变量 s++; //成员变量 } public void test(int j) { 
          j++; //局部变量 如果此处想要成为成员变量,就需要在变量前面添加一个this关键字 i++; //成员变量 s++; //成员变量 } public static void main(String[] args) { 
          Test01 test01 = new Test01(); Test01 test02 = new Test01(); test01.test(10); test01.test(20); test02.test(30); System.out.println(test01.i + "," + test01.j + "," + test01.s); System.out.println(test02.i + "," + test02.j + "," + test02.s); } } 

执行结果:

2,1,5 1,1,5 

4、过程分析(重点)

执行这两句以后,对应的信息变化为下图:

补充:

  1. 先对该类进行初始化,即会调用对应的clint方法,在方法区中为s开辟一块空间
  2. 实例化对象的时候,会调用对应的init方法,其中init方法由非静态实例变量显示赋值代码非静态代码块对应构造器代码组成
  3. 非静态实例变量显示赋值代码:i = 0, j = 0
  4. 非静态代码块:执行 {} 中的代码块(在栈中开辟一个栈帧),其中代码块中的 i 为局部变量,代码块执行完毕消失。但是 j 为成员变量,所以会进行对应的 +1 操作(就近原则),成员变量 i 结果不变。
  5. 对应构造器代码:此处无参构造没有任何效果,所以可以忽略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M9bdbPfj-1591754744864)(06_成员变量和局部变量.assets/image-20200607205942615.png)]

执行这三行代码以后内存的分配情况,如下图:

补充:

  1. test01调用对应的test方法的时候,j 是局部变量所以 j 值为11,注意区分此处的 j 和堆内存中的 j 值。
  2. test方法中的 i 值为成员变量,所以会在堆内存中被修改为1
  3. test方法中的 s 值也是成员变量,并且其是static变量,所以 s 变量会在方法区中进行 +1 操作
  4. 再次执行test01中的test方法,重复1-3的步骤
  5. 执行test02对象中的test方法,i 的 +1 在堆中完成,s 的 +1 操作在方法区中完成,j 的 +1 操作在栈中完成 j = 31(由于 j 变量是局部变量,所以在执行对应的操作以后,失效)

成员变量和局部变量详解


5、补充

当局部变量与xx变量重名时,如何区分:

  1. 局部变量与实例变量重名
    • 在实例变量前面提添加 “this.” 关键字
  2. 局部变量与类变量重名:
    • 在类变量前面加 “类名.”













版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228022.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午8:00
下一篇 2026年3月16日 下午8:00


相关推荐

  • react路由配置

    react路由配置包含了LInk跳转以及js触发跳转并传参。这是项目的目录结构,主要的代码都在src目录下,src下面新建一个containers文件夹放我们的一些组件,router文件夹是配置路由用的。按照顺序来写:detail文件夹下的代码importReactfrom’react’classDetailextendsReact.Component{render(){

    2022年6月4日
    43
  • 无法解析的外部符号解决方法汇总[通俗易懂]

    无法解析的外部符号解决方法汇总[通俗易懂]本文介绍了如何在工程中使用.lib库,以及出现无法解析的外部符号的原因和解决方法。

    2022年6月28日
    39
  • HTML实用的网页代码大全[通俗易懂]

    HTML实用的网页代码大全[通俗易懂]【一】:符号<p>段落</p> <h>标题</h>(h1—h6) <br>:换行 <hr>:分割线 左右尖括号:<> &表示为:&amp "表示为:" 表格形式<table>

    2022年6月3日
    67
  • 批处理删除指定文件夹中的指定类型文件

    批处理删除指定文件夹中的指定类型文件批处理删除指定文件夹中的指定类型文件

    2026年3月17日
    2
  • LaTeX数学符号大全

    LaTeX数学符号大全本篇博文介绍一些常用的 LaTeX 符号 方便使用时查询 文章目录 1 操作符 2 关系符 3 希腊字母小写大写 4 箭头 5 点 6 上标 7 其他 8 命令符 9 跨行或跨列的符号 1 操作符 SymbolComman pm pm mp mp times times div div cdot

    2026年3月26日
    2
  • maven配置本地仓库位置「建议收藏」

    maven配置本地仓库位置「建议收藏」在下载好的maven文件中我创建了一个文件夹,做为我的maven的本地仓库接下来就是在conf文件夹中打开setting.xml文件找到这个标签,里面配置刚刚我创建的文件夹的地址,这个地址就配置成了我的本地仓库啦以后下载的依赖就都在这个文件夹下了…

    2026年2月24日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号