一、使用小述
1. 首先解释一下static是什么意思?
Static是静态的意思,既然是静态,就是不变的,而不变就是他不会因为类中实例化对象的不同而不同,它在类中永远只有一份,就像中国人有许多,但我们只有一个国家中国。
2.由Static修饰的归属问题
由static修饰的不管是变量还是方法,都属于类直接管理,所以类中所有的方法(这里方法包括静态和实例)都可以调用他们,就像公司里的打印机,它是属于公司的,公司里的人员(实例)都可以用它。
例如:
Class Program
{
Static int i;
Static void main() {
Console.WriteLine(i); }
Void Aa()
{
Console.WriteLine(“aaaaaaaaa”);
main(); //实例方法可以调用静态方法main()
}
}
3.Static修饰的范围
①Static可以修饰类,使类成为静态类。这样在此类中只能定义静态的方法和静态的变量。
②static可以修饰变量,这个变量只能是成员变量,不能是局部的。
既不能修饰方法体中的变量,以及形式参数。
③static可以修饰方法,Main方法必须用static修饰,因为它是与程序共存亡的,是程序的入口和结束的大门。
例如:
Class Test
{
Static int i; //正确,静态成员变量,即使没有赋值,系统赋默认值0
Int i; //正确,实例成员变量
Void Bb(static string str){ //错误,形式参数不能用static修饰
Int b; //错误,局部变量必须手动赋值,才可以使用
Static int b; //错误,局部变量不能用static修饰
}
}
Static Class Test
{
Static void Aa() {} //正确
Void Bb() {} //错误,静态类不能定义实例方法
}
4.static修饰的调用
①在本类里调用由static修饰的方法和变量,可以直接用
Class A
{
Static int i;
Static void main() {
Console.WriteLine(i);
Bb();
}
Static void Bb(){
Console.WriteLine(“ccccccccccccc”);
}
}
②在外类中调用static修饰的方法和变量,类名。方法名
或类名。变量名
Class Program{
Static void Aa() {
Console.WriteLine(“bbbbbbbb”); }
}
Class Test {
Program.Aa();
}
二、static关键字所导致的内存泄漏问题
大家都知道内存泄漏和内存溢出是不一样的,内存泄漏所导致的越来越多的内存得不到回收的失手,最终就有可能导致内存溢出,下面说一下使用staitc属性所导致的内存泄漏的问题。
在dalvik虚拟机中,static变量所指向的内存引用,如果不把它设置为null,GC是永远不会回收这个对象的,所以就有了以下情况:
非静态内部类的静态引用。然后在2秒之后我们要finish掉这个activity,会造成什么问题呢?我们知道,内部类和外部类之间是相互持有引用的,SecondActivity实例持有了haha的引用,但这里haha是用static修饰的,上面说了,虚拟机不会回收haha这个对象,从而导致SecondActivity实例也得不到回收,造成内存溢出。
这货还在这得不到回收。
怎么解决这个问题呢,很简单,只要在Activity的onDestroy方法里把haha设为null就行啦
那么还有另外一种情况,单例的问题。单例也是用了其static属性,很多单例,往往需要用到context对象,而又是通过传值的方式获得,比如:
先来一个单例
再来一个Activity来用它,context传入一个this,再2秒之后关闭Activity
后来我们发现这货还在,又是得不到回收:
怎么办呢,还是像上面那样,把静态对象设置为null,或者我们传入context的时候,别传this了,this可是当前Acitvity啊,传Application Context即可。但是不是都可以传Application Context呢,明显不是,有的事是Application Context干不了的,这个得看具体情况而定。