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