【第22期】观点:IT 行业加班,到底有没有价值?

static修饰属性

原创 2016年08月29日 23:17:41

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

static 可以修饰类? java在给类命名不区分大小写

1.static可以修饰类吗?答案是肯定的,如看以下代码: public class TestDemo { static class TestDemo_01{ public TestDe...

Java static修饰属性(类变量)、static修饰方法(类方法)

一、static修饰属性(类变量)  1.由类创建的所有的对象,都共用这一属性。  2.类变量随着类的加载而加载,即使此类还未new过对象,这个类变量也存在,而且仅一份;  然而,实例变量是类new过...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

static修饰类,变量和方法,代码块

static修饰符的介绍

用static关键字修饰类

Java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。被static修饰的内部类可以直接作为一个普通类来使用,而...
  • G0_hw
  • G0_hw
  • 2017-04-09 14:18
  • 89

为什么用static来修饰方法或者变量?用处?

对于用static修饰的变量称为静态变量,也叫类变量。由类创建的所有对象都可以共用这个变量。类变量随着类的加载而加载,即使此类还未new过对象,这个类变量也存在,而且仅一份。 顺便说一下实例变量,实...

static修饰符的作用及应用

/* static 修饰符 1.数据共享成员变量(实例变量)和静态变量(类变量)的区别 1.两个变量的生命周期不同 成员变量随对象的创建而存在,随对象被回收而释放 静态变量随类的加载而存在,...

static修饰符详解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何...

Java中的静态修饰符 static

静态修饰符的特点 static是一个修饰符,用于修饰成员(成员变量和成员函数) 静态成员随着类的加载而加载。 静态成员优先于对象存在。 静态成员被所有对象所共享 静态成员多了一...

[C/C++]_[初级]_[关于static修饰符的说明]

场景: 1. static 修饰符具有静态共享特性, 在C/C++里一般用来作为共享变量使用,或者节约内存声明的常量或不改变大小的存储区. 2. static活用的话也可以作为单例模式的便捷方式. [...

static修饰符分析

static 修饰符可以修饰 方法、成员变量、初始化块和成员内部类。 1.static 方法 “static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)