static修饰属性及静态变量在内存中区域的状态
今天写程序遇到一点小问题,最后问题出在成员变量修饰符上,static修饰符
public class Students {
private static int id; //静态成员变量
private static String name; //
private static float score; //
public Students(int id, String name, float score) {
this.id = id;
this.name = name;
this.score = score;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
Students.name = name; //类的属性改为非静态的话,这里"Students"改为"this"
}
public float getScore() {
return score;
}
public void setScore(float score) {
Students.score = score; //类的属性改为非静态的话,这里"Students"改为"this"
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//练习3:定义一个学生数组,要求学生有id,姓名,成绩属性,用数组保存其对象,至少5个学生对象,
// 写一个方法,参数为id,显示对应学生的姓名和成绩
inquiry(2);
}
public static void inquiry(int id) {
Students s0 = new Students(0, "Amado", 89);
Students s1 = new Students(1, "Bianca", 84);
Students s2 = new Students(2, "Cicely", 82);
Students s3 = new Students(3, "Dia", 80);
Students s4 = new Students(4, "Ed", 92);
Students[] students = new Students[]{s0,s1,s2,s3,s4};
for (int i = 0; i < students.length; i++) {
if (id == students[i].getId()) { //条件不满足,程序不会执行if语句,因为程序执行第五个new对象语句后,id值为4,传的参数 2 != 4
System.out.println("姓名:" + students[i].getName() + ",分数:" + students[i].getScore());
System.out.println(students[i]);
}
System.out.println("s" + i + students[i] + " " + students[i].getId() + students[i].getName() + students[i].getScore());
}
}
}
输出结果为:
s0com.Mini.examin4.Students@659e0bfd 4Ed92.0
s1com.Mini.examin4.Students@2a139a55 4Ed92.0
s2com.Mini.examin4.Students@15db9742 4Ed92.0
s3com.Mini.examin4.Students@6d06d69c 4Ed92.0
s4com.Mini.examin4.Students@7852e922 4Ed92.0
从输出结果中,可看出测试类中,for循环遍历对象数组,输出结果中,堆内存中有5个对象地址,但是这5个地址中存放的属性值一样,而且都是new的最后一个对象的属性。
要想让程序实现:传入参数id值,显示对应的学生的姓名和成绩信息,只需要把Students类的static成员变量,改为non-static(把static修饰符去掉即可)。
分析:因为Students类中属性都是static的,这些静态成员变量存放在方法区中,static 修饰属性:无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量;一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随之发生变化。对象在堆区,共享类的static变量(在方法区),所以,输出的地址不一样(生成了5个对象),而对象指向的属性值一样。