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(){

}

普通类不可以被static修饰  只有内部类可以被static修饰

作用就是外部类可以直接根据类名.来获取内部的属性/行为

3.静态初始化是什么时候完成的:

我们知道java是先编译后解释的语言。.java文件编译成.class文件,在通过jvm实例解释为可执行文件。其实在编译过程中static这个关键字会编译成特定的字节码指令。在解释过程中jvm实例读取到该指令时,就能识别它为静态。就会根据静态的规则去初始化它。非静态类是碰到new或其他一些字节码指令,在初始化阶段去完成初始化。类加载具体步骤时:加载---连接(验证,准备,解析)----初始化---卸载---回收

正常情况类完成初始化时在初始化阶段。但是static的时在准备阶段就完成了。相当于提前完成了初始化。所以static对象有的情况下,非静态对象还没有被创建出来。因此非静态对象/方法不能直接在静态方法中使用。反之可以。

代码体现(以下代码非多线程。多线程内容后续文章会有)

1.静态方法只能出现静态属性/行为,不能出现非静态属性或行为。this关键字当然也不行。

java原理篇------static关键字_第1张图片

2.根据静态的特性演变的java代码应用

1.静态类。常见形式作为一般工具类

java原理篇------static关键字_第2张图片

2缓存:提前将数据保存到对象中,其实就是加载到内存中,提高效率

下面代码模拟提前去数据库中将数据查询出来

缓存工具类

java原理篇------static关键字_第3张图片

StaticDao类

java原理篇------static关键字_第4张图片

测试类:BufferStaticTest

java原理篇------static关键字_第5张图片

3计数,统计相关的应用

统计类

java原理篇------static关键字_第6张图片

统计测试类

java原理篇------static关键字_第7张图片

以上为小兵对static的愚见。欢迎大神补充。

你可能感兴趣的:(原理)