关键字static
1. 静态变量
静态变量:⼜称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接 通过类名来访问它。静态变量在内存中只存在⼀份。
实例变量:每创建⼀个实例就会产⽣⼀个实例变量,它与该实例同⽣共死。
public class A {
private int x; // 实例变量
private static int y; // 静态变量
}
2. 静态⽅法
静态⽅法在类加载的时候就存在了,它不依赖于任何实例。所以静态⽅法必须有实现,也就是说它不能 是抽象⽅法。
public abstract class A {
public static void func1(){
}
// public abstract static void func2(); // Illegal combination of modifiers: 'abstract' and 'static'
}
只能访问所属类的静态字段和静态⽅法,⽅法中不能有 this 和 super 关键字,因为这两个关键字与具体对象关联。
public class A {
private static int x;
private int y;
public static void func1(){
int a = x;
// int b = y; // Non-static field 'y' cannot be referenced from a
static context
// int b = this.y; // 'A.this' cannot be referenced from a
static context
}
}
3. 静态语句块
静态语句块在类初始化时运⾏⼀次。
public class A {
static {
System.out.println("123");
}
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
}
}
123
4. 静态内部类
⾮静态内部类依赖于外部类的实例,也就是说需要先创建外部类实例,才能⽤这个实例去创建⾮静态内部类。⽽静态内部类不需要。
public class OuterClass {
class InnerClass {
}
static class StaticInnerClass {
}
public static void main(String[] args) {
// InnerClass innerClass = new InnerClass(); // 'OuterClass.this'cannot be referenced from a static context
OuterClass outerClass = new OuterClass();
InnerClass innerClass = outerClass.new InnerClass();
StaticInnerClass staticInnerClass = new StaticInnerClass();
}
}
静态内部类不能访问外部类的⾮静态的变量和⽅法。
5. 静态导包
在使⽤静态变量和⽅法时不⽤再指明 ClassName,从⽽简化代码,但可读性⼤⼤降低。
import static com.xxx.ClassName.*
在静态导入之前:
public class TestStatic {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.toHexString(42));
} }
在静态导入之后:
import static java.lang.System.out;
import static java.lang.Integer.*;
public class TestStaticImport {
public static void main(String[] args) {
out.println(MAX_VALUE);
out.println(toHexString(42));
} }