Java回归线之Static修饰符

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);
    }
  }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值