实例变量和类变量

Java内存管理分为两个方面:内存分配和内存回收。这里的内存分配特指创建Java对象时JVM为该对象在内存中所分配的内存空间;内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制自动清理该对象,并回收该对象所占用的内存。由于JVM内置了垃圾回收机制回收失去引用的Java对象所占用的内存,所以很多Java开发者认为Java不存在内存泄露、资源泄露的问题。实际上这是一种错觉,Java程序依然会有内存泄露。
由于JVM的垃圾回收机制由一条后台线程完成,本身也是非常消耗性能的,因此如果肆无忌惮地创建对象,让系统分配内存,那么这些分配的内存都将由垃圾回收机制进行回收。这样做有两个坏处:
 不断分配内存使得系统中可能的内存减少,从而降低程序的运行性能
 大量已分配内存的回收使得垃圾回收的负担加重,减低程序的运行性能

局部变量分为三种:
 形参
 方法内的局部变量
 代码块内的局部变量
局部变量的作用时间很短暂,它们都被存储在栈内存中

从Java程序的角度来看,static就是一个标志,static的作用是将实例成员变为类成员。static只能修饰在类里定义的成员部分,包括成员变量、方法、内部类(枚举与借口)、初始化块。如果没有使用static修饰类里的这些成员,这些成员属于该类的实例;如果使用了static修饰,这些成员就属于类本身。由此可见,static只能修饰类里的成员,不能修饰外部类,不能修饰局部变量、局部内部类。

如果一个是实例变量,一个是类变量,则实例变量总是可以引用类变量。
这是因为:static修饰的成员变量属于类,类变量会随着类初始化得到初始化。在初始化一个对象之前,肯定得先初始化该对象所属的类

使用static修饰的成员变量是类变量,属于该类本身;没有使用static修饰的成员变量是实例变量。属于该类的实例。在同一个JVM内,每个类只对应一个Class对象,但每个类可以创建多个Java对象
由于同一个JVM内每个类只能对应一个Class对象,因此同一个JVM内的一个类的类变量只需要一块内存空间;但对于实例变量而言,该类没创建一次实例,就需要为实例变量分配一块内存空间。也就是说,程序中有几个实例,实例变量就需要几块内存空间

大部分时候会把类和对象严格地区分开来,但从另一个角度来看,类也是对象,所有类都是Class的实例。每个类初始化完成后,系统都会为该类创建一个对应的Class实例,程序可以通过反射来获取某个类所对应的Class实例。例如,要获取Person类对应的Class实例,通过Person.class;或Class.forName("Person"),一条代码即可

对于实例变量而言,它属于Java对象本身,从程序运行的角度来看,每次程序创建Java对象时都需要为实例变量分配内存空间,并对实例变量执行初始化。
从语法角度来看,程序可以在三个地方对实例变量执行初始化。
 1、定义实例变量时制定初始值
 2、非静态初始化块中对实例变量指定初始值
 3、构造器中对实例变量指定初始值
其中第1、2方式(定义时指定初始值和非静态初始化块中指定初始值)比第三种方式(构造器中指定初始值)更早执行,但第1、2种方式执行顺序与它们在源程序中的排列顺序相同
定义变量时指定的初始值和初始化块中指定的初始值的执行顺序,与它们在源程序中的排列顺序相同
定义实例变量时指定初始值、初始化块中为实例变量指定初始值的语句的地位是平等的,经编译器处理后,它们都将被提取到构造器中

定义实例变量时指定初始值、初始化块中为实例变量指定初始值、构造器中为实例变量指定初始值,三者的作用完全类似,都用于对实例变量指定初始值。经过编译器处理之后,它们对应的赋值语句都被合并到构造器中。在合并过程中,定义变量语句转换得到的赋值语句、初始化块里的语句转换得到的赋值语句,总是位于构造器的所有语句之前;合并后,两种赋值语句的顺序保持为它们在源代码中的顺序

类变量属于Java类本身。从程序运行的角度来看,每个JVM对一个Java类只初始化一次,因此只有每次运行Java程序时,才会初始化该Java类,才会为该类的类变量分配内存空间,并执行初始化。
从语法角度来看,程序可以在两个地方对类变量执行初始化
 定义类变量时指定初始值
 静态初始化块中对类变量指定初始值
这两种方式的执行书序与它们在原程序中的排序相同

先为所有类变量分配内存空间,再按源代码中的排列顺序执行静态初始化块中所指定的初始值和定义类变量时所指定的初始值

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值