static
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2. static代码块
3. static方法
********
static的数据或方法,属于整个类的而不是属于某个对象的,是不会和类的任何对象实例联系到一起。所以子类和父类之间可以存在同名的static方法名,这里不涉及重载。所以不能把任何方法体内的变量声明为static,例如:
fun()
{
}
其实理解static是只有一个存储地方,而使用时直接使用,不需要创建对象,就能明白以上的注意事项。
另外,一般的类是没有static的,只有内部类可以加上static来表示嵌套类。
final
1. final变量
2. final方法
注意,类中所有的private方法都被隐含是final的。由于无法取用private方法,则也无法重载之。
3. final类
-----------------
特别要注意一个问题:
看个例子:
importjava.util.ArrayList;
public class TestStaticFinal{
privatestaticfinal String strStaticFinalVar="aaa";
privatestatic StringstrStaticVar =null;
privatefinal StringstrFinalVar =null;
privatestaticfinalint intStaticFinalVar =0;
privatestaticfinal IntegerintegerStaticFinalVar =new Integer(8);
privatestaticfinal ArrayListalStaticFinalVar =new ArrayList();
privatevoid test(){
System.out.println("-------------值处理前----------");
System.out.println("strStaticFinalVar=" +strStaticFinalVar + "");
System.out.println("strStaticVar=" +strStaticVar + "");
System.out.println("strFinalVar=" +strFinalVar + "");
System.out.println("intStaticFinalVar=" +intStaticFinalVar + "");
System.out.println("integerStaticFinalVar="+ integerStaticFinalVar + "");
System.out.println("alStaticFinalVar=" +alStaticFinalVar + "");
//strStaticFinalVar="哈哈哈哈";//错误,final表示终态,不可以改变变量本身.
strStaticVar="哈哈哈哈"; //正确,static表示类变量,值可以改变.
//strFinalVar="呵呵呵呵"; //错误,final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改。
//intStaticFinalVar=2; //错误, final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改。
//integerStaticFinalVar=newInteger(8); //错误,final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改。
alStaticFinalVar.add("aaa"); //正确,容器变量本身没有变化,但存放内容发生了变化。这个规则是非常常用的,有很多用途。
alStaticFinalVar.add("bbb"); //正确,容器变量本身没有变化,但存放内容发生了变化。这个规则是非常常用的,有很多用途。
System.out.println("-------------值处理后----------");
System.out.println("strStaticFinalVar=" +strStaticFinalVar + "");
System.out.println("strStaticVar=" +strStaticVar + "");
System.out.println("strFinalVar=" +strFinalVar + "");
System.out.println("intStaticFinalVar=" +intStaticFinalVar + "");
System.out.println("integerStaticFinalVar="+ integerStaticFinalVar + "");
System.out.println("alStaticFinalVar=" +alStaticFinalVar + "");
}
publicstaticvoid main(String args[]){
newTestStaticFinal().test();
}
}
public class TestStaticFinal{
}
输出结果
-------------值处理前----------
strStaticFinalVar=aaa
strStaticVar=null
strFinalVar=null
intStaticFinalVar=0
integerStaticFinalVar=8
alStaticFinalVar=[]
-------------值处理后----------
strStaticFinalVar=aaa
strStaticVar=哈哈哈哈
strFinalVar=null
intStaticFinalVar=0
integerStaticFinalVar=8
alStaticFinalVar=[aaa,bbb]
以上内容参考了
Java关键字final、static使用总结。