我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,有时候,我们希望该类的所有成员共享一个成员。这时可以用static来修饰。
Java中static作为修饰符,可以用来修饰变量、方法、代码块。
1、静态方法
被static修饰的变量成为静态变量,又可以成为静态成员或类成员。它属于整个类所有,而不是某个对象所有,被类的所有对象共享。类变量在类加载的时候初始化分配空间,而且只被初始化一次,直到该类被卸载时才将资源回收。
静态成员可以使用类名直接访问,也可以使用对象进行访问。在程序中任何对象对静态变量做修改,其它对象看到的是修改后的值。
public class Test {
static String play="football";
public static void main(String[] args) {
System.out.println("通过类访问静态变量,"+play);
Test test=new Test();
System.out.println("通过对象访问静态变量,"+test.play);
test.play="basketball";
System.out.println("通过对象访问静态变量,"+test.play);
}
}
2、静态方法
用static修饰的方法,称为静态方法或类方法,经常用到的main方法就是静态方法。
静态方法中可以直接调用同类中的静态变量,但不能直接调用非静态变量,可以通过创建对象后访问非静态变量;静态方法中不能直接调用非静态方法,可以通过对象来访问非静态方法。
public class Test {
String game="DOTA";
static String play="football";
public static void main(String[] args) {
print();
}
public static void print(){
System.out.println("访问静态变量,"+play);
// System.out.println("访问非静态变量,"+game); //静态方法不能直接访问非静态变量
Test test=new Test();
System.out.println("访问非静态变量,"+test.game);
// show();//静态方法不能直接调用非静态方法
test.show();
}
//普通方法中,可以直接访问同类的非静态变量和静态变量
public void show(){
System.out.println("访问静态变量,"+play);
System.out.println("访问非静态变量,"+game);
print();//普通方法可以直接调用静态方法
}
}
3、代码块
用static去修饰类里面的一个独立的代码块,称为静态代码块。
静态初始化块只在类加载时执行,且只会执行一次,静态代码块没有名字,不能显示调用,只能在类加载的时候调用。
静态初始化块只能给静态变量赋值,不能初始化普通成员变量。
public class Test{
String film;
String game;
static String play;
public static void main(String[] args) {
Test test=new Test();
System.out.println("film="+test.film);
System.out.println("game="+test.game);
System.out.println("play="+play);
Test test2=new Test();
}
public Test(){
film="爱奇艺";
System.out.println("通过构造方法赋值 film");
}
{
game="DOTA";
System.out.println("通过初始化块赋值 game");
}
static {
play="football";
// game="DOTA";//不能赋值
System.out.println("通过静态初始化块赋值 play");
}
}
输出结果:
通过静态初始化块赋值 play
通过初始化块赋值 game
通过构造方法赋值 film
film=爱奇艺
game=DOTA
play=football
通过初始化块赋值 game
通过构造方法赋值 film