`

static 修饰符介绍

    博客分类:
  • J2SE
阅读更多

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代码块可以执行一些初始化操作。

      下面是一个缓存的例子:
Java代码

   1. import java.util.Collection; 
   2. import java.util.LinkedHashMap; 
   3. import java.util.Map; 
   4.  
   5. /**
   6. * 使用 LinkedHashMap 创建 LRU cache. 
   7. */ 
   8. public class LRUCache { 
   9.   private static int cacheSize = 0; 
  10.   private static float loadFactor = 0.75f; // default 
  11.   private static LinkedHashMap map = new LinkedHashMap(cacheSize, loadFactor, true) { 
  12.     protected boolean removeEldestEntry(Map.Entry eldest) { 
  13.       return size() > LRUCache.this.cacheSize; // return false; 
  14.     } 
  15.   }; 
  16.  
  17.   private LRUCache(int cacheSize){ 
  18.     this.cacheSize=cacheSize; 
  19.   } 
  20.    
  21.   public static LRUCache newInstance(){ 
  22.     LRUCache cacheMap=new LRUCache(100); 
  23.     return cacheMap; 
  24.   } 
  25.    
  26.   public synchronized void clear() { 
  27.     map.clear(); 
  28.   } 
  29.  
  30.   public synchronized Object get(Object key) { 
  31.     return map.get(key); 
  32.   } 
  33.  
  34.   public synchronized void put(Object key, Object value) { 
  35.     map.put(key, value); 
  36.   } 
  37.  
  38.   public synchronized Object remove(Object key) { 
  39.     return map.remove(key); 
  40.   } 
  41.  
  42.   public synchronized int size() { 
  43.     return map.size(); 
  44.   } 
  45.  
  46.   public synchronized Collection values() { 
  47.     return map.values(); 
  48.   } 
  49.   public static LinkedHashMap getMap() { 
  50.     return map; 
  51.   } 
  52.  
  53.   public static void setMap(LinkedHashMap map) { 
  54.     LRUCache.map = map; 
  55.   } 
  56.  
  57.   public static void main(String[] args) { 
  58.     // testing 
  59.     int size = 3; 
  60.     LRUCache cache = new LRUCache(size); 
  61.     cache.put(new Integer("1"), "1"); 
  62.     cache.put(new Integer("2"), "2"); 
  63.     cache.put(new Integer("3"), "3"); 
  64.  
  65.     String value = (String) cache.get(new Integer(1)); 
  66.     System.out.println(value); 
  67.     System.out.println("Testing ..."); 
  68. //    cache.put(new Integer("4"), "4"); 
  69.     Object[] values = cache.values().toArray(); 
  70.  
  71.     for (int i = 0; i < values.length; i++) { 
  72.       value = (String) values[i]; 
  73.       System.out.println(value); 
  74.     } 
  75.   } 
  76. } 
 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics