Java成员变量、局部变量

                             Java成员变量、局部变量

分类

成员变量

局部变量

六个变量的加载顺序如下

但是这六种变量为什么是这样的加载顺序?

创建位置


 


分类

成员变量在使用对象之前就加载好,而局部变量需要在类或对象调用方法时才会创建

个人认为,这种分类方式有点粗糙,以下是比较详细的变量分类方式:

成员变量

在这里,成员变量分为类变量和实例变量。

类变量是类加载过程中的准备阶段就已经分配内存了,直至类被销毁,类变量的内存才会释放

实例变量是在类的实例创建(创建对象)时存在直至实例被销毁

 

1 访问类变量的方式有两种:类.类变量、实例.类变量。除了类本身可以对类变量进行修改外,类的实例也会对类变量进行修改,且其他实例也会看到变化

2 访问实例变量的方式就只有一种:实例.实例变量。每个实例的实例变量都不对其他实例可见

 

局部变量

局部变量在此分为形参、方法局部变量和代码块局部变量。

1 形参是方法签名上的局部变量,当对象调用方法时传入了实参,但是传入方法的过程中会创建一个形参,作为值传递的副本

2 方法局部变量是在方法中创建变量

3 而代码块局部变量,即类中定义好的代码块

六个变量的加载顺序如下

通过上述对变量的介绍,可以得到答案。先看主函数有没有创建对象,有创建对象的话看对应类中代码块有没有输出语句,然后返回主函数,依次执行语句和访问方法。可以看出,这六个变量的加载顺序如下

但是这六种变量为什么是这样的加载顺序?

按虚拟机加载顺序划分变量类型

我们用类加载->创建对象->调用方法的顺序来介绍变量的加载顺序。

类加载

创建对象

实例变量和实例代码块是在创建对象后,进行对象初始化的时候才加载到内存中

调用方法

在调用有参函数的时候,虚拟机会将实参复制后,生成形参,实参和形参的值相同,但是内存地址不同,即形参相对于实参来说,只是另一个有着同样的值的变量

所以在有参函数调用的过程中,形参先于方法局部变量被加载

创建位置

方法区:类信息、类变量(静态变量和常量)、方法
堆:对象、成员变量
栈:局部变量

(1)当程序运行时,首先通过类装载器加载字节码文件,经过解析后装入方法区!在方法区中存了类的各种信息,包括类变量、常量及方法。对于同一个方法的调用,同一个类的不同实例调用的都是存在方法区的同一个方法。类变量的生命周期从程序开始运行时创建,到程序终止运行时结束!
(2)当程序中new一个对象时,这个对象存在堆中,对象的变量存在栈中,指向堆中的引用!对象的成员变量都存在堆中,当对象被回收时,对象的成员变量随之消失!
(3)当方法调用时,JVM会在栈中分配一个栈桢,存储方法的局部变量。当方法调用结束时,局部变量消失!
 

全部评论

相关推荐

06-25 16:00
武汉大学 Java
工科研究生底薪工资就开3k啊??
机械打工仔:写文章提成的岗位工资低,你怪工科?
点赞 评论 收藏
分享
感觉他们一点都不了解现在这个社会就业有多难,已经在牛客刷到好多篇 延毕的帖子了,延毕就会导致已经找好的工作就没了,还得重新再找,学校和老师们是怎么想的呢????看到学生丢失工作会开心吗 就业数据都在造假,真实的就业困难不去解决 一个个真是好样的
从今天开始狠狠卷JVAV_癫:学生看到的是导师不放实习导致offer黄了。 导师看到的是招进来的学生吃自己补助和自己的招生名额,却没给自己升迁带来任何帮助,还要跑路。 根本利益的不一致,最主要留校的导师大概率是职场上招聘失败的,被迫留校的,什么牛鬼蛇神都会有
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务