JAVA-初步认识-第七章-this关键字-成员变量和静态变量的区别
一.
成员变量一旦被static修饰,功能就变的不一样,那么static修饰的成员变量还是成员变量么?
通常将static修饰的成员变量称之为静态变量。叫成员变量不可以,要和一般的成员变量进行区分。因为静态变量可以类名调用,但是成员变量不可以。
name除了叫成员变量外,还叫实例变量。实例是对象,它是对象中的变量,(静态变量也是对象中的变量,是共享数据。→错误,可以不创建类,而调用调用静态变量)
之前讨论局部变量和成员变量时,成员变量是在堆内存当中,堆里面装的都是实例。所以对象存在,name才存在,因此,成员变量也被称为实例变量,实例中的变量。静态变量又称为类变量,类可以直接访问的变量,或者叫所属类的变量。
类变量和类类型变量是两回事,类类型变量实际上是局部变量。
二. 两变量的区别
对第一句进行理解,其实一直想知道静态变量在内存中的图解。如果是主函数中的输出语句,通过类名调用静态变量,那么描述类是这个时候才加载,然后调用静态变量?还是在源程序刚加载的时候,就已经加载入内存了?成员变量是随着对象的,虽然成员变量和静态变量都是写在描述类中的,但是在内存中实际上是分开来的。
类什么时候消失呢?这里说的类是描述类还是创建类?还是说两个都有?一般情况下,虚拟机结束了,类就消失了。如果虚拟机不结束,类就一直存在?如果类加载特别的多,计算机会挂(说的有道理)。后面会讲到类本身是个对象,它在内存里面也是按着对象的形式来存储的。通过这个类对象,可以创建出很多,通过new创建出来的对象(那么这里的类说的创建类,而非描述类),来封装具体的数据,而当这种类的对象过多的时候,也就是说你加载好多类进来以后,垃圾回收机应该是可以对它进行回收的。它的回收有着自己的判定方式,如果这个类很长时间不用了,它就会把它清除掉,想用的时候再加载。
生命周期不一样,这也是静态变量的弊端,成员变量随着对象消失就消失了,而静态变量随着类的存在而一直存在,这也是不建议定义太多静态变量的原因。拿类名调用是很简单,但是生命周期太长。生命周期长,好过占用很多内存空间(意指如果没有静态变量,那么每个对象中都有一个相同的变量,相当占空间)。静态变量是一种优化,虽然生命周期有点长。
在使用静态数据的时候,建议不要用对象,即使有对象,也不建议用。使用类名调用这种专属调用方式,提高阅读性。
静态变量能够存储在哪?不可能在堆中,堆不可能单独放个变量。堆里面放的全都是实体,而数据全在实体里面。静态变量没有实体,所以不可能在堆内存中。那会不会放在栈中,栈中数据用完是直接释放的,栈的生命周期较短,而且是随着方法的加载而加载进来的,说明这也不行。静态变量存在于另外一片内存当中。之前说过内存分为五片,寄存器,方法区,本地方法区,栈,堆。本地方法区调用的是系统中底层内容的,寄存器是给cpu的,最后只剩下方法区。方法区的叫法有多种,数据区,共享区。
谈到现在,都没有说过方法在哪儿放,方法放置在方法区。