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关键字修饰的内存图
注意事项
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修饰的方法是优先于对象加载的,所以相当于对象还没有创建,就使用了,所以会报错。
总结:静态方法只能访问静态的成员变量和静态的成员方法;通俗来说就是静态修饰的方法只能访问被静态修饰的变量或者方法,而非静态方法既可以访问被静态修饰的也可以访问非静态的。