static关键字
1、静态变量
在Java语言中,按照是否静态可以对成员变量分为两种:
一种是被static修饰的变量,叫静态变量或类变量;
另一种是没有被static修饰的变量,叫实例变量。
JVM在加载类的过程中完成静态变量的内存分配,可用类名.方法名直接调用,当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响
2、静态方法
声明为static的方法有以下几条限制:
它们仅能调用其他的static 方法;
它们只能访问static数据;
它们不能以任何方式引用this 或super。
非静态的方法与特定的对象关联
static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的
静态方法的调用和静态变量的调用相同。
Java中的main就是一个静态的方法。
3、静态代码块
静态代码块是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
4、一个简单的例子:
代码参考:http://www.cnblogs.com/lzq198754/p/5767066.html(感谢楼主)
class Value3 {
static int c = 0;
Value3(int i) {
c = i;
}
A. static {
StaticDetail.prt("First Value3.c = "+Value3.c);
Value3.c = 5;
}
static void inc() {
c++;
}
}
public class StaticDetail {
public static void prt(String s) {
System.out.println(s);
}
Value3 v = new Value3(10);
static Value3 v1, v2;
B. static {
prt("Second Value3.c = "+Value3.c);
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
v1 = new Value3(27);
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
v2 = new Value3(15);
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
}
public static void main(String[] args) {
StaticDetail ct = new StaticDetail();
prt("ct.c=" + ct.v.c);
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
v1.inc();
prt("ct.c=" + ct.v.c);
prt("v1.c=" + v1.c + " v2.c=" + v2.c);
}
}
分析:
首先执行A处的静态代码块,输出初始化的c的值0,然后把c的值修改为5;
然后执行B处的静态代码块:
输出修改的c的值5;
通过实例对象访问静态变量,分别输出c的值;
执行main函数,在创建对象的过程中再次修改静态变量的值;
执行静态方法,再次修改静态变量的值。
程序执行结果:
First Value3.c = 0
Second Value3.c = 5
v1.c=5 v2.c=5
v1.c=27 v2.c=27
v1.c=15 v2.c=15
ct.c=10
v1.c=10 v2.c=10
ct.c=11
v1.c=11 v2.c=11
final关键字
根据字面意思,final的意思是:最终的、最后的、无法改变的
final变量(常量)
final关键字可以修饰静态变量、成员变量和局部变量
final常量的特点是 :final变量一旦被初始化,就不可以被更改,也就相当于常量
final方法和final类
特点:final方法行业final类不能被继承,如果我们不希望扩展这个类以及类中的方法,可以直接声明该类是final类
常见的final类:java.lang.Boolean、java.lang.Math、java.lang.String等
final参数
当函数参数被final关键字修饰时,该参数无法被修改
public void showStatic(final int a){
a++;
}
在java中,这种试图修改final参数的做法是不被允许的
总结:
public和static一起修饰的变量相当于全局变量
public、final和static一起修饰的变量实际上是一个全局常量,例如:public static final double PI