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