static 关键字

140 阅读1分钟

示例:静态方法内部,不能访问非静态的成员变量和非静态的方法

class A{
    private String name;
    public void test(){
        // Modifier 'static' is not allowed here
        // 修饰符
        // static String id;
    }
    static void staticTest(){
        //  Non-static field 'name' cannot be referenced from a static context
        System.out.println(name);
        //  Non-static method 'test()' cannot be referenced from a static context
        test();
    }
}

但是,可以通过传递一个对象的引用到静态方法里,然后通过这个引用来调用非静态的变量和方法。
结论: 静态方法内部,不能直接访问非静态的成员变量和非静态的方法

class A{
    private static int id;
    private String name;
    public void display(){

    }
    public static void test(A a){
        // Modifier 'static' is not allowed here
        // 修饰符
        // static String id;
        System.out.println(a.name);
        a.display();
    }
}

示例:静态方法内部,能访问静态的成员变量和静态的方法

class A{
    private static int id;
    public static void test(){
        // Modifier 'static' is not allowed here
        // 修饰符
        // static String id;
    }
    static void staticTest(){
        System.out.println(id);
        test();
    }
}

总结:
static 修饰符
静态变量:
对于静态变量来说,无论一个类实例化多少对象,它的静态变量只有一份拷贝。静态变量也被称为类变量。局部变量不能被声明为 static 变量。
示例:

public class Test {

    public static void main(String[] args) {
        A a1 = new A();
        a1.test();
        A a2 = new A();
        a1.test();
    }
}


class A{
    private static int id;

    public static int getId() {
        return id;
    }

    public static void add(){
        id++;
    }
    public void test(){
        System.out.println("start:" + getId());
        for (int i = 0; i < 10; i++) {
            add();
        }
        System.out.println("end:" + getId());
    }
}

输出结果:
start:0
end:10
start:10
end:20
静态方法:
静态方法不能访问类的非静态变量或方法。