java原理篇------static关键字
静态,static
明白三点:
1.JDK1.7之前方法区中的类,static信息,方法信息,常量池都处于方法区
1.7之后的版本将类,static信息,方法信息,常量池都放到了堆中。但是没有取消,而且增加的元空间概念
为什么如此:查的一些资料上写的是,这样就可分别更多内存,也方便内存回收处理。避免exception is java.lang.OutOfMemoryError: PermGen space
以及该部分内存线程共享,只会加载一次。
2.静态:静态属性,静态方法
静态属性:指用static修饰的变量
static String xxxx
静态属性特殊类型:final static String xxx 常量
静态方法:指用static修饰的方法
public static void xxx(){
}
3.静态初始化是什么时候完成的:
我们知道java是先编译后解释的语言。.java文件编译成.class文件,在通过jvm实例解释为可执行文件。其实在编译过程中static这个关键字会编译成特定的字节码指令。在解释过程中jvm实例读取到该指令时,就能识别它为静态。就会根据静态的规则去初始化它。非静态类是碰到new或其他一些字节码指令,在初始化阶段去完成初始化。类加载具体步骤时:加载---连接(验证,准备,解析)----初始化---卸载---回收
正常情况类完成初始化时在初始化阶段。但是static的时在准备阶段就完成了。相当于提前完成了初始化。所以static对象有的情况下,非静态对象还没有被创建出来。因此非静态对象/方法不能直接在静态方法中使用。反之可以。
代码体现(以下代码非多线程。多线程内容后续文章会有)
1.静态方法只能出现静态属性/行为,不能出现非静态属性或行为。this关键字当然也不行。
2.根据静态的特性演变的java代码应用
1.静态类。常见形式作为一般工具类
2缓存:提前将数据保存到对象中,其实就是加载到内存中,提高效率
下面代码模拟提前去数据库中将数据查询出来
缓存工具类
StaticDao类
测试类:BufferStaticTest
3计数,统计相关的应用
统计类
统计测试类
以上为小兵对static的愚见。欢迎大神补充。