static 修饰符
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
1、静态变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。
静态变量和实例方法,它们的字节码都位于方法区内。
2、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3、静态代码块
静态代码块是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块(类被初始化的时候,仅仅调用一次 ),如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
如果类中有静态代码块,它将会先执行静态代码块,然后再执行构造方法。如果父类中有静态代码块,它将会先执行父类中的静态代码块,再执行子静态代码块, 然后再依次执行父类的构造方法和子类的构造方法;
因此,static的用途很广泛:static变量可以用作缓存;static方法可以当做工具方法;static代码块可以执行一些初始化操作。
下面是一个缓存的例子:
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 使用 LinkedHashMap 创建 LRU cache.
*/
public class LRUCache {
private static int cacheSize = 0;
private static float loadFactor = 0.75f; // default
private static LinkedHashMap map = new LinkedHashMap(cacheSize, loadFactor, true) {
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > LRUCache.this.cacheSize; // return false;
}
};
private LRUCache(int cacheSize){
this.cacheSize=cacheSize;
}
public static LRUCache newInstance(){
LRUCache cacheMap=new LRUCache(100);
return cacheMap;
}
public synchronized void clear() {
map.clear();
}
public synchronized Object get(Object key) {
return map.get(key);
}
public synchronized void put(Object key, Object value) {
map.put(key, value);
}
public synchronized Object remove(Object key) {
return map.remove(key);
}
public synchronized int size() {
return map.size();
}
public synchronized Collection values() {
return map.values();
}
public static LinkedHashMap getMap() {
return map;
}
public static void setMap(LinkedHashMap map) {
LRUCache.map = map;
}
public static void main(String[] args) {
// testing
int size = 3;
LRUCache cache = new LRUCache(size);
cache.put(new Integer("1"), "1");
cache.put(new Integer("2"), "2");
cache.put(new Integer("3"), "3");
String value = (String) cache.get(new Integer(1));
System.out.println(value);
System.out.println("Testing ...");
// cache.put(new Integer("4"), "4");
Object[] values = cache.values().toArray();
for (int i = 0; i < values.length; i++) {
value = (String) values[i];
System.out.println(value);
}
}
}
分享到:
相关推荐
Java static修饰方法。例子仅供参考。
也是通过查阅网上资料,初略的整理了一下,(包含了final、static、abstract和访问修饰符public、protect、default、private)写成规范文档希望对有需要的提供些帮助
Java 关键字修饰成员变量例子。
先看下面的例子,它将告诉我们在JS世界中也有C#里的public , private ,及static等
auto、register、static、extern等存储类修饰符的区别.
static:修饰符:修饰变量,函数。作用域:变量仅仅在本文件可见,函数在本文件可以被调用。static在函数内部定义的话,分配在堆中,数值保存在data段,而不是在栈中,而且只赋值一次。 extern:修饰符:修饰变量,...
主要介绍了Java编程中protected关键字与static关键字的作用,是Java入门学习中的基础知识,需要的朋友可以参考下
本文主要给大家介绍了关于c++中static修饰符的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 下面一段是引用自effective c++ 中的一句话: 所谓的static对象,其寿命是从构造出来到...
以下是对Java修饰符abstract,static,final的区别进行了详细的介绍,需要的朋友可以过来参考下
JAVA访问修饰符
java代码-使用java解决static修饰方法的源代码 ——学习参考资料:仅用于个人学习使用!
java练习题chp7 Key Point ●static ●final ●abstrac
java修饰符:public、protected、private、final、static、abstract、default
static final 包 权限修饰符 内部类 的思维导图
java中final和static讲解及实例
自己总结的java中final和static的区别,请大家提出宝贵意见。
除了构造方法之外,父类的所有 方法和属性都被子类的对象继承 多态性是不同的实例对象以不同的方式对相同的信息作出不同的表现 访问修饰符用于确定访问类成员的方式 Java 常用修饰符有 static、final、abstract 接口...
static 可以修饰初始化代码块扩充内容三、final(最终的,最后的)1.final可以修饰变量2.final可以修饰方法3.final可以修饰类总结abstract、static、final可以修饰的内容abstract、static、final是否可以修饰构造...
java中的非访问修饰符的作用各不一样,据我所知常用的有六种: static final abstract synchronized volatile transient 今天我们只讲前三种,后面三种等我们讲到线程的时候再回过头来讲。 首先还是通过一张经典的表...
java代码-日常练习32 静态修饰符 static 修饰:类 类的成员(变量及方法)