Java 基础 -1 - 内存管理之内存分配

原创
2016/05/07 17:08
阅读数 12

1.基础 

内存区 :  栈内存   (局部变量 ),堆内存(对象) ,方法区 (贮存方法)。

局部变量 (随方法结束消亡): 形参 ,  方法内局部变量 ,代码块中局部变量   。

成员变量 :   类变量 (静态变量 )  ,实例变量 ; 类变量初始化在实例变量之前 。(即使 写在实例变量之后 )。

关于static 只能修饰 类里面定义的成员: 成员变量, 方法 ,内部类,内部枚举类, 代码块   。

代码块理解成几个成员变量放在一起,成员变量语句也可理解成,单句的代码块。因此代码块与成员变量具有相同优先级。

2.内存分配过程:

遵循以下三点 :

①对于同一个jvm 来说每个类只对应 一个Class 对象, 也就是 类加载一次 (开辟一段内存空间), 但是每次创建一次实例对象就对应一个 Java对象 ,也就是实例化多次 (在堆内存 开辟多个对象内存空间) ,并且每次实例化的对象中都不包含类成员。每个类在程序运行过程中第一次调用时 会加载一次,即产生一个class 对象。 

②每当程序调用 构造方法 创建对象时 ,会对变量进行初始化 即开辟内存空间 。初始化顺序为 如下:(该类已经被加载过,即静态块已经被初始化):先对非静态初始化快进行初始化,之后对构造器初始化 。

③含有继承关系的内存分配:每当程序调用子类的属性或者方法时 ,程序会先从其最高父类 进行初始化,根据先初始化 非静态方法 再初始化构造器 的顺序  进行初始化  。依次 初始化 最高父类 ,父类 , 一直到调用方法的子类。 

若父类有多个构造方法,调用哪个构造方法遵循以下:SUPER () 显式调用 则根据形参参数判断 ,this()调用子类重载构造, 不写 默认 调用父类无参构造,若父类无无参构造 则视为编译错误。

④:初始化块执行初始化 与 定义实例变量执行初始化 因为是平等的 所以同时被提到 构造方法中进行初始化 (开辟内存空间),赋值顺序依照 程序中书写顺序。

⑤:对于以上初始化顺序,若程序第一次调用该类,则优先初始化 静态块,调用构造方法 。之后再按照 ② ,③中顺序进行初始化 。

3. 其他:

类变量可以通过类访问 也可以通过 实例访问 ,本质都是通过类访问 ,都是访问的同一个类变量,假如通过实例访问 进而改变类变量的值,那么 再通过其他实例调用类变量值都改变。

向上造型时 ,父类引用调用子类重写方法 ,视为调用的子类的方法。调用 与父类同名属性则视为调用父类属性。

展开阅读全文
打赏
2
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
2
分享
返回顶部
顶部