java -static的特性和使用,静态类/方法/块/内部类/回收机制

mark一下,今天的做业。java

java-core P115ide

若是将域定义为static,每一个类中只有一个这样的域。(这里的域应该是指一片物理数据空间,而不是单纯的指代某一个变量,而是静态域)。大数据

public class Test1st {
    public static int aaa=1;
    public static int bbbb=2;}

public class Testabc {
    @Test
    public void testTest(){
        System.out.println("aaa:"+Test1st.aaa+",bbb:"+Test1st.bbbb);
    }
}

com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 test.Testabc,testTest
aaa:1,bbb:2

Process finished with exit code 0

 

每一个对象对于本身的实例域都有本身的一份拷贝,静态域属于类,不属于任何独立的对象。spa

静态方法是一种不能向对象实施操做的方法。线程

如下两种状况下使用静态方法:code

1.一个方法不须要访问对象状态,全部参数都是经过显示参数提供。对象

2.一个方法只须要访问类的静态域,例如(Employee.getNextId)blog

工厂模式中用static关键字较多,每一个类对象均可以对公有域进行修改,可是公有常量(final)不能够,final+static+public的合用能够避免公有常量被类对象修改。即避免公有方法中的常量对象被新的对象覆盖和修改,从而影响到公有常量的正确性。内存

e.gssl

public class System{
  ...
  public static final PrintStream out=...;
 ...    
}
System.out =new PrintStream(...);//ERROR- out is final

  

静态内部类

 1.内部类的概念:定义在一个类中的类,能够访问该类做用域中的数据,包括private的数据,且对同个package中的其余类隐藏。

2.有时候使用内部类只是为了把一个类隐藏在另外一个类的内部,而不须要内部类引用外部类对象。能够将内部类声明为static,以便取消产生的引用。(该内部类不须要引用外部对象,而外部对象须要完成一些操做可是不想从新建立一个其余的类,因而建立一个内部类,在外部对象中直接调用这个内部类的方法,该内部类若是不是static,会在被引用时报错。P244)

 

回收机制(本身总结的,可能有误,请参考多方)

类相关的信息加载后是存储在Method Area(线程公有部分,存储包括类信息,常量,静态变量,编译器代码等,如HotSpot的永久代)中,通常除了classloader卸载该类,那么该部分的信息不会被回收掉。

方法区得回收通常是针对常量池和对类的卸载。当方法区没法知足内存分配需求时,会发生OOM。

以此致使的内存泄漏问题类型较多。

 

内存泄漏相关:

Android  参考

1.类的静态变量持有大数据对象:静态变量长期维持对象的引用,阻止垃圾回收。

public static final  Bitmap=......;

  

2.非静态内部类的静态实例

非静态内部类会维持一个到外部类实例的引用,若是非静态内部类维持的这个实例是静态的,就会间接长期维持着外部类的引用,阻止被系统回收

3.Handler临时性内存泄漏(*)

Handler非静态,在与MessageQueue和Activity/Service之间交流时,若是Message在Queue中等待时间过长,会致使handler不会被回收。若是Handler是非静态的,会致使Acitivity或者Service不会被回收。

4.容器中的对象没清理

一般把一些对象的引用加入集合中,若是不须要该对象时,若是没有把引用从集合中清理掉,这个集合就会愈来愈大,若是这个集合时static,状况更加严重。

相关文章
相关标签/搜索