首页 理论教育 实例变量和类变量

实例变量和类变量

时间:2022-02-28 理论教育 版权反馈
【摘要】:Java虚拟机管理这块区域,并把它分为堆区、方法区和Java栈区。因此,相同类的任何一个对象访问类变量时,取的是相同的数据;相同类的任何一个对象修改类变量时,也都是对同一个内存单元进行操作。当类被加载时,类变量被创建并分配内存空间,当类被卸载时,类变量被销毁并收回所分配内存空间。

4.4.2 实例变量和类变量

实例变量:在类体内且在方法体外定义的变量,且变量名前没有static修饰符。

类变量:在类体内且在方法体外定义的变量,且变量名前有static修饰符。

局部变量:在方法体内或块内定义的变量,变量名前只能用final修饰或没有修饰符。

【例4-7】 定义圆类Circle,它包含半径、圆类对象的总个数和局部变量,并用测试类测试Circle类。

img175

img176

img177

程序运行结果:

img178

分析与思考:(1)Java虚拟机的运行时数据区是操作系统为Java虚拟机进程分配的内存区域。Java虚拟机管理这块区域,并把它分为堆区、方法区和Java栈区。

(2)对象、类变量和实例变量在数据区的位置如下(如图4-2所示):

①类变量和方法:方法区。

②对象:堆区。

③局部变量:Java栈区。

④引用型变量:引用型变量是局部变量时,它在Java栈区;引用型变量是类的实例变量时,它在堆区;引用型变量是静态变量时,它在方法区。

从运行结果可以看出,radius是实例变量,它是在对象创建时才分配空间(位于对象堆区中),并保存一个对象的半径数据,实例变量的生命周期与对象存在的时间相同。total是类变量。它们是在加载类时分配空间(位于类的方法区中),换句话说,类变量是所有对象的公用存储单元,可实现一个类中不同对象间的通信。因此,相同类的任何一个对象访问类变量时,取的是相同的数据;相同类的任何一个对象修改类变量时,也都是对同一个内存单元进行操作。局部变量object1、object2、object3在main()方法栈区中,局部变量var_number在print()方法栈区中。

img179

图4-2 对象、类变量和实例变量在数据区的位置

总之,类变量位于方法区,在内存中只有一个,被类的所有实例共享。当类被加载时,类变量被创建并分配内存空间,当类被卸载时,类变量被销毁并收回所分配内存空间。因此,类变量的生命周期与类的生命周期相同。类变量属于类,不属于任何一个类的具体对象。

实例变量位于堆区。当创建实例时,实例变量被创建并分配内存空间,当销毁实例时,实例变量被销毁并收回所分配内存空间。因此,实例变量的生命周期与实例的生命周期相同。实例变量属于实例(即对象)。

局部变量位于栈区,当调用一个方法或方法中的语句块时,为该方法或语句块中的局部变量分配内存空间,当结束调用一个方法或语句块时,会结束该方法或语句块中的局部变量。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈