static关键字可以用来修饰变量,修饰方法,静态代码块,静态内部类以及静态导包。
static修饰变量
static变量是属于类级别的,随着类的加载而加载,类的每个实例都是访问的这个静态变量,在内存中只有一份。
public class StaticVarDemo {
public static void main(String[] args) {
StaticClass staticClass1 = new StaticClass();
staticClass1.staticVar = 10;
StaticClass staticClass2 = new StaticClass();
staticClass2.staticVar = 20;
System.out.println(staticClass1.staticVar);
System.out.println(staticClass2.staticVar);
StaticClass.staticVar = 30;
System.out.println(staticClass1.staticVar);
System.out.println(staticClass2.staticVar);
}
}
class StaticClass {
public static Integer staticVar;
}
Output:
20
20
30
30
静态变量staticVar设置为30,通过staticClass1,staticClass2访问staticVar值也为30.
另外我们可以直接通过类名来访问静态变量,不用创建类实例来访问,可以很清楚的表明静态变量属于类级别。
static修饰方法
public class StaticVarDemo {
public static void main(String[] args) {
StaticClass staticClass1 = new StaticClass();
staticClass1.staticVar = 10;
StaticClass staticClass2 = new StaticClass();
staticClass2.staticVar = 20;
System.out.println(staticClass1.staticVar);
StaticClass.staticVar = 30;
System.out.println(staticClass1.staticVar);
System.out.println(staticClass2.getStaticVar());
}
}
class StaticClass {
public static Integer staticVar;
public static Integer getStaticVar(){
return staticVar;
}
}
Output:
20
30
30
值得注意的是:
1.只能在静态方法内调用静态属性或者静态方法,不能调用非静态属性和方法
2.静态方法可以通过它的类引用访问,并且不需要创建类的实例。虽然也可以使用实例引用访问,但与通过类引用访问相比没有任何区别
3.随着类的加载而加载,且在内存中只有一份
静态代码块
静态代码块是类初始化的一部分,用static包裹起来的代码块
public class StaticVarDemo {
static {
System.out.println("Hello world~");
}
static {
System.out.println("Learn static");
}
public static void main(String[] args) {
}
}
Output:
Hello world~
Learn static
在内存中加载类时,就会执行静态块。一个类可以有多个静态块,以在类定义中出现的相同顺序执行。
静态内部类
静态内部类与其他静态成员一样,属于类级别,因此可以访问内部静态类而不具有外部类的对象。
public class StaticVarDemo {
private static Integer world = 2;
public static void main(String[] args) {
System.out.println(StaticInnerClass.hello);
System.out.println(StaticInnerClass.getHelloWorld());
}
static class StaticInnerClass{
public static Integer hello = 1;
public static Integer getHelloWorld(){
return hello + world;
}
}
}
Output:
1
3
值得注意的是:
静态内部类不能访问外部类的非静态成员。
只能访问外部类的静态成员。
静态导包
静态导入类中的静态成员,并允许它们在没有类引用的情况下使用。
要使用静态成员(方法和变量)我们就要用类.类方法(类变量)。如果使用了静态导包,就不用在给出类了。
//Static import statement
import static java.lang.System.out;
public class StaticVarDemo {
public static void main(String[] args) {
out.println("hello world");
}
}
总结
1.静态成员属于类。不需要创建类实例来访问静态成员。
2.静态成员(变量和方法)只能在静态方法和静态块中访问。
3.不能在静态方法、块和内部类中访问非静态成员。
4.一个类可以有多个静态块,以在类定义中出现的相同顺序执行。
5.只有声明为内部类时,类才可以是静态的。
6.静态导入可用于从类导入所有静态成员。使用时就不用在给出类了。