Java高阶语法---static

 

背景:据说static Java高阶语法是挺进BAT必经之路。java

 

static:面试

静态static,不少时候会令我望文生义,可是get到了static最重要的一点,其余的理解都还ok。spa

static最重要的一点就是:类属性中被static所引用的变量会被看成Gabage Collection的root根节点,而root就意味着着这一类变量基本上是不会被GC回收的,code

即便System.gc() 都不会被回收,So,static很容易引发内存泄漏。对象

官方的解释就是:static能够修饰属性、方法和内部类,static修饰属性或方法后,属性和方法不在属于某个特定的对象,而是全部的共享,也就是说static成员不依赖blog

某个对象,在类加载是就被初始化了;static修饰的属性或方法,能够直接使用类名调用,而不用先实例化对象再调用。内存

在面试的时候还能够补充:当一个属性或者方法和对象没有关系,或者说是没有任何对象共享的时候,那么就能够用staic修饰,使其实现共享;例如:get

1. 某个银行的帐户计算器,用来计算银行帐户个数,那么此计算器属性就是全部对象共有的属性,就应该用static修饰;源码

2. System 类中的currentTimeMillis() 方法,用来获取系统当前时间的毫秒值,这个方法和System 类的对象没有关系,System类对象想要共享这个方法,那么这个方法io

就能够用static 修饰;(源码currentTimeMillis()方法:public static native long currentTimeMillis(); )

还能够和面试官说,本身曾经遇到过一个内存泄漏的问题,就是由于static修饰的一个Map类型的变量致使的,集合容器用static修饰,不须要的对象没有被及时处理致使集合愈来愈大,最后经过排查类堆栈信息找到问题所在,这波static面试美滋滋。

 

 FYI:

 1 import java.util.HashMap;  2 import java.util.Map;  3 import lombok.extern.slf4j.Slf4j;  4 
 5 @Slf4j  6 public class TestStatic {  7     private static String staticName = "share";  8     @SuppressWarnings("unused")  9     private String unstaticName = "unshare"; 10     @SuppressWarnings("rawtypes") 11     public static Map map = new HashMap(); 12     @SuppressWarnings("unused") 13     public static void main(String[] args) { 14         String myName = TestStatic.staticName; 15        //String youName = TestStatic.unstaticName; unable
16  TestStatic.staticMethod(); 17         //TestStatic.unstaticMethod(); unable
18         TestStatic.testOutOfMemmory(args, args);  //存储对象的容器是static容器形成内存泄漏 19         //System.gc(); unWork
20  } 21     public static void staticMethod() { 22         log.info("I'm static method, share."); 23  } 24     public void unstaticMethod() { 25         log.info("I'm unstatic method, can't share."); 26  } 27     @SuppressWarnings("unchecked") 28     public static void testOutOfMemmory(String[] name,String[] age) { 29  map.put(name, age); 30  } 31     
32 }
相关文章
相关标签/搜索