static用法

458 阅读3分钟

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.静态导入可用于从类导入所有静态成员。使用时就不用在给出类了。