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

mark一下,今天的作业。

java-core P115

如果将域定义为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

 

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

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

以下两种情况下使用静态方法:

1.一个方法不需要访问对象状态,所有参数都是通过显示参数提供。

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

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

e.g

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,情况更加严重。

原文地址:https://www.cnblogs.com/zhizhiyin/p/11833802.html