您的位置:首页 > 编程语言 > Java开发

Java中变量的内存分配

2016-05-30 11:20 309 查看
Java内存管理分为两个方面:内存分配 内存回收

这里的内存分配特指当创建一个java对象时JVM为该对象在堆内存中分配内存空间。

内存回收:当java对象失去引用,变成垃圾时,

          JVM的垃圾回收机制会(1)自动清理该对象(2)回收该对象所占用的内存。

虽然JVM内置了垃圾回收机制,但是java程序依然会存在内存泄漏,如果肆无忌惮创建对象,让系统分配内存,最后由垃圾回收机制回收。会带来:

(1)不断分配内存使得系统中可用内存减少,

(2)已经分配的内存的回收使得垃圾回收的负担加重。

一、实例变量和类变量

在java中变量大体可以分为成员变量和局部变量

局部变量:(1)方法内部的局部变量:必须在方法内对其进行显示的初始化,初始化后生效,随方法结束而消亡。

        (2)代码块内部的局部变量:必须在代码块内对其进行显示的初始化,初始化后生效,随代码块结束而消亡。

        (3)形参:在方法签名中定义的局部变量,由方法的调用者为其赋值,随方法调用结束而消亡。

方法签名:由方法名称和一个参数列表(参数的顺序和类型)组成。

局部变量都被储存在方法的栈中。

成员变量:在类体内定义的变量。

(1)类变量(静态变量):

      1、在定义成员变量被static关键字所修饰时,那么该成员变量可称为静态变量或者类变量;

      2、可以向前引用;

     3、变量属于类本身,类变量不依赖类的实例,类变量只在初始化时候在内存中被分配一次空间,无论类的实例被创建几次,都不再为类变量分配空间;

     4、通过类的任意一个实例来访问类变量,底层都将将其转为通过类本身来访问类变量;

     5、一旦类变量的值被改变,通过类或类的任意一个实例来访问类变量,得到的都将是被改变后的值;

     6、将在类的初始化之前初始化。

(2)实例变量

      1、在定义成员变量时没有使用static关键字所修饰,那么该成员变量可称为实例变量或者非静态变量。

      2、不能向前引用,如果向前引用,则称为非法向前引用,这是不允许的

      3、变量属于类的实例对象,每创建一个对象便会对实例变量分配一次内存。

非静态代码块
    直接由 { } 包起来的代码,称为非静态代码块

静态代码块
    直接由 static { }包起来的代码,称为静态代码块

二、初始化

静态变量(类变量)、静态代码块
将在类被初始化创建实例对象之前被初始化,而且是按顺序从上到下依次被执行;
实例变量(非静态变量)、非静态代码块

初始化实际上是会被提取到类的构造器中被执行的,但是会比类构造器中的代码块优先执行到,其也是按在程序中的顺序从上到下依次被执行。

当一个类从被JVM装载开始,各种代码的执行顺序大致如下:
被JVM装载->执行父类的相关代码->如果有静态初始化,先执行静态初始化,且只执行一次,以后即使有该类实例化,也不会再执行->如果有静态代码块,以与静态初始化一样的方式执行->如果有new语句带来的实例化,先为成员变量分配空间,并绑定参数列表,隐式或显式执行super(),即父类的构造方法,->执行非静态代码块-〉执行本类的构造函数-〉执行其他代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息