java面向对象上(三)成员变量和局部变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/strivenoend/article/details/83240997

成员变量和局部变量与内存的关系?

成员变量(实例变量+类变量)以对象的形式存储在堆内存,是在类中定义的变量,类变量的生存期最长,随类的销毁而释放内存,实例变量第二,随对象的销毁而释放内存

局部变量出现在方法中,存储在栈内存,实在方法中定义的变量,随方法的结束而释放内存

成员的变量无需显示初始化,编译器会给他自动初始化,系统可对其默认初始化

局部变量必须显示初始化,否则编译时会出错

类的变量是类的变量,类的方法是属于类的fangfa

实例的变量是实例的变量,实例的方法是属于实例的方法。 

类的变量和方法与实例的变量和方法的生命周期不同,类的生命周期>实例的声生命周期,但两者的变量都存放在堆内存中

类变量随类的存在而存在,实例变量随实例的存在而存在,同一个类的所有实例访问类变量时,实际访问的是该类本身的用一个变量,也就是说访问了同一片内存去

普通的方法存储在栈内存
成员变量什么时候分配内存的,什么时候初始化的??

类变量是加载类,jvm为类变量分配内存,并且同时用静态初始化块/系统默认对类变量进行初始化,写入数据

(此处如果被加载类是子类的话,那么初始化时系统会默认从根节点所在父类加载静态初始化块/系统默认初始化,最后才执行到本类的静态初始化块/系统默认)

实例变量时创建对象时,为实例变量分配内存,并且同时用初始化块/ 构造器/系统默认对实例变量进行初始化,写入数据

(此处如果实例化的是子类的对象的话,那么初始化时系统会追溯到根节点所在父类开始依次调用父类的初始化块,父类的构造器,父类的默认,最后才执行到本类的初始化块,构造器,系统默认)

局部变量什么时候分配内存的,什么时候初始化的??

局部变量是方法加载到内存,为局部变量分配内存,并且对局部变量初始化,写入数据,局部变量必须显示初始化,系统不会为其默认初始化

----------------------------------------------------------------------------------------------------

成员变量的初始化和在内存中的运行机制

嗯~ o(* ̄▽ ̄*)o那么什么时候加载类呢?系统第一次用到类时会加载类,然后为类的类变量分配内存空间,并指定默认初始值

那么什么时候创建对象呢?new的时候,系统会为对象的实例变量分配内存空间,并指定默认初始值

局部变量的初始化和在内存中的运行机制

局部变量在系统调用该方法时,为其分配内存,并且为其存入初始值用

局部变量只保存基本类型变量的值或者对象的地址值,因此局部变量所占的内存区小,

---------------------------------------------------------------------------------------

成员变量比局部变量占用内存大,生存周期长,对系统应用程序的开销大

猜你喜欢

转载自blog.csdn.net/strivenoend/article/details/83240997
今日推荐