static关键字有什么用呢?

比如我要定义一个person类,这个类中有一个属性是国籍,而我们需要实例化的对象都是中国人,这里就出现一个问题,难道说我每次new一个对象就得为他赋一个中国吗,这样是不是就没有面向对象的感觉了,这个时候就可以用一个静态修饰符static来修饰这个变量,请看下面这个例子:

public class Person {
    private static String nationality="中国";
    private String name;

    public static String getNationality() {
        return nationality;
    }

    public static void setNationality(String nationality) {
        Person.nationality = nationality;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我建个测试类来测试一下

public class TestPerson {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(p.getNationality());
        Person p2 =new Person();
        System.out.println(p2.getNationality());
    }
}

运行结果:

中国

中国

 无论哪个对象的nationality属性的值都是中国,上面的那个问题就解决了。

static关键字的特点

1、随着类的加载而加载
2、优先于对象存在
3、被类的所有对象共享
4、被static修饰的方法可以通过类名直接调用无需创建对象。

下面我们就来比较一下他和成员变量的区别 

  所属不同 内存中位置不同 内存出现时间不同 调用方式不同
成员变量 属于对象 堆内存 随对象的加载而加载,消失而消失 对象名.变量名
静态变量 属性类 方法区中的静态区 随类的加载而加载,消失而消失 对象名.变量名 或者类名.变量名

static关键字修饰的内存图

java关键字static

注意事项

public class Person {
    private static String nationality="中国";
    private String name;

    public static String getNationality() {
        return nationality;
    }

    public static void setNationality(String nationality) {
        this.Person.nationality = nationality;
    }

}

注意看这段程序,他是无法编译通过的。理由很简单,因为在静态方法中出现了this关键字,this就相当于当前这个类的对象,而刚才也说了static修饰的方法是优先于对象加载的,所以相当于对象还没有创建,就使用了,所以会报错。

总结:静态方法只能访问静态的成员变量和静态的成员方法;通俗来说就是静态修饰的方法只能访问被静态修饰的变量或者方法,而非静态方法既可以访问被静态修饰的也可以访问非静态的。

相关文章: