static修饰属性

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;
    }

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        Students.score = score;
    }
}

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个对象),而对象指向的属性值一样。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值