zoukankan      html  css  js  c++  java
  • Java高阶语法---static

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

     

    static:

    静态static,很多时候会令我望文生义,但是get到了static最重要的一点,其他的理解都还ok。

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

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

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

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

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

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

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

    就可以用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 }
  • 相关阅读:
    oracle提交commit后回退恢复
    jQuery toggle() 方法 : 切换隐藏和显示
    sql server vs mysql
    Redis学习
    【转发】c#做端口转发程序支持正向连接和反向链接
    IKVM
    注册表
    解决VS2010自带的C/C++编译器CL找不到mspdb100.dll的问题
    【转载】Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration info
    Openwrt路由器上开发微信公众号应用
  • 原文地址:https://www.cnblogs.com/taojietaoge/p/10259277.html
Copyright © 2011-2022 走看看