static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。
看一个例子:
public class Static {
int b=20;
static int a=10;
public Static(){
System.out.println("Static initial");
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println(Static.a);
//b=40;//提示:不能对非静态字段进行静态引用
Static hello1=new Static();
Static hello2=new Static();
hello1.b=40;//变量b仅为hello1实例所有,修改其值不影响hello2实例中b的值
hello1.a=30;//变量a为hello1与hello2两个实例所共有,修改其中一个,另外一个也被改了
//System.out.println(Static.this.b);//提示:不能在静态上下文中使用this
System.out.println(hello1.a);//提示:应该以静态方式访问静态字段Static.a
System.out.println(hello1.b);
System.out.println(hello2.a);//提示:应该以静态方式访问静态字段Static.a
System.out.println(hello2.b);
}
从该例可以看出:
1、被static修饰的成员变量和成员方法独立于该类的任何对象。即它不依赖于特定的实例,被类的所有实例所共享。
2、static修饰的成员变量与方法不用被实例化便可以使用,故不能使用关键词this(表示对象)来访问
3、从1中可以得到两点结论:第一,创建N个实例后,若修改其中一个实例的被static修饰的成员变量,则其他实例的该变量则也发生相应改变,但没有被static修饰的成员变量不会发生这种情况;第二,被static修饰的成员变量的访问形式为类名.成员变量,若以对象.成员变量的形式来访问也是可以的,但不规范。
关于内存使用:
1、static变量
被static修饰的变量称为静态变量,反之称为实例变量。
对于静态变量内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,该过程在加载类的过程中完成,可用类名直接访问(方便),当然也可以用对象来访问(不推荐)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中由多个拷贝,互不影响(灵活)
举个例子:对于人这个类,眼睛数目这个变量便可以为静态变量,因为所有人都有两只眼睛,但眼睛颜色则必须定义为实例变量,应为不同的人眼睛颜色可能存在差异。
2、static方法
参考static变量
3、static代码块
static代码块的作用为为static变量赋值
注意:
要慎用static,因为被static修饰的成员变量与方法为所有对象所共有,修改其值将修改所有的对象中相应的值。