所谓静态属性就是 用static关键字修饰的类的属性,他所具有的特点是为所有对象或方法所共享的一个静态的属性,从内存的角度来理解,静态属性放在静态池中,只分配一次内存空间,随着JVM的结束而消失。
stack(栈)是JVM的内存指令区。stack管理很简单,push一定长度字节的数据或者指令,stack指针压栈相应的字节位移;
pop一定字节长度数据或者指令,stack指针弹栈。stack的速度很快,管理很简单,并且每次操作的数据或者指令字节长度是已知的。
所以Java 基本数据类型,Java 指令代码,常量都保存在stack中。
heap (堆)是JVM的内存数据区。heap 的管理很复杂,每次分配不定长的内存空间,专门用来保存对象的实例。
在heap 中分配一定的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,
并不保存对象的方法(方法是指令,保存在stack中),在heap 中分配一定的内存保存对象实例和对象的序列化比较类似。
而对象实例在heap 中分配好以后,需要在stack中保存一个4字节的heap 内存地址,用来定位该对象实例在heap 中的位置,便于找到该对象实例。
总结一下该过程:当一个class文件被ClassLoader load进入JVM后,方法指令保存在stack中,此时heap区没有数据。
然后程序技术器开始执行指令,如果是静态方法,直接依次执行指令代码,当然此时指令代码是不能访问heap 数据区的;
如果是非静态方法,由于隐含参数没有值,会报错。因此在非静态方法执行前,要先new对象,在heap中分配数据,
并把stack中的地址指针交给非静态方法,这样程序技术器依次执行指令,而指令代码此时能够访问到heap数据区了。
总结一下:静态属性保存在stack指令内存区,动态属性保存在heap 数据内存区。
//单例模式
package com.uniteque;
public class SingletonInstance {
//1.该对象的构造方法为private,因为只能实例化一次,并且只能在该类内部实例化,不能再该类之外实例化
private SingletonInstance(){
}
//2.该类内部实例化,作为常量,加载到jvm中
public final static SingletonInstance single = new SingletonInstance();
//3.唯一实例只能通过getSingleton()方法访问获得
public static SingletonInstance getSingleton(){
return single;
}
}
还没有评论,来说两句吧...