1、基本概念:
-
通常情况下成员变量隶属于对象层级,每创建一个对象就需要申请独立的内存空间来存放该对象独立的成员变量信息,若**所有对象的某个成员变量数值完全一样**(比如某个学校的学生信息,所有学生的学校是完全一样的)却又单独存放会造成内存空间的浪费。
-
为了解决上述问题,使用static关键字修饰成员变量表达静态的含义,此时该成员变量由对象层级提升为类层级被所有对象共享,该成员变量随着类加载准备就绪,与是否创建对象无关。
-
static关键字也可以修饰成员方法,推荐使用 类名. 的方式访问。
学生类Student:
public class Student {
private String name;
private Integer age;
// private String school;//隶属于对象层级,每个对象都有独立的一份
public static String school;//隶属于类层级,所有对象共享一份
public Student() {
}
public Student(String name, Integer age, String school) {
this.name = name;
this.age = age;
this.school = school;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + ''' +
", age=" + age +
", school='" + school + ''' +
'}';
}
}
测试一下是否被所有对象共享:
public static void main(String[] args) {
Student student1 = new Student("刘亦菲",20,"清华");
Student student2 = new Student("刘诗诗",30,"清华");
System.out.println("---------------------------------------------------------------------");
student1.setSchool("北大");
System.out.println("student2.setSchool=" +student2.getSchool());
Student student3 = new Student();
System.out.println("student3.setSchool="+student3.getSchool());
}
测试结果:
--------------------------------------------------------------------- student2.setSchool=北大 student3.setSchool=北大
缺陷:一个学生改了学校其他所有的都会更改!!!



