static关键字

来源:互联网 发布:mac os镜像下载iso 编辑:程序博客网 时间:2024/06/11 01:09

static关键字:
一、问题
1、需求:描述一下学生类。
2、代码:

3、内存分析:

4、存在的问题:
1)情况一:
问题:如果所有的学生都是中国,有n个学生就会有n份中国的数据存内存中,这样子会浪费内存。
解决方案: 把“中国“这个数据移动到数据共享区中,共享这个数据给所有的Student对象使用即可。
内存分析:

2)情况二:
问题:如何才能把这个数据移动到数据共享区中共享呢?
解决方案:只需要使用static修饰该数据即可。
代码:

5、注意:静态的成员变量只会在数据共享区中维护一份,而非静态成员变量的数据会在每个对象中都维护一份的。

二、static(静态)
1、代码:

2、问题:为什么结果是小日本,而不是中国。
3、内存分析:

4、变化代码:

原因:去掉了static,那么在每一个堆内存中都会有一个country对象。
5、再变化代码:

三、static(静态\修饰符)
1、static修饰成员变量 :如果有数据需要被共享给所有对象使用时,那么就可以使用static修饰。
1)静态成员变量的访问方式:
方式1: 可以使用对象进行访问。

格式: 对象.变量名;

方式二: 可以使用类名进行访问。

格式: 类名.变量名;


2)注意:
a)非静态的成员变量只能使用对象进行访问,不能使用类名进行访问。

s1.name;//可以访问Student.name;//不可以访问

b)千万不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候才使用static修饰。
c)静态成员变量可以不赋值(与final关键字对比(final修饰的成员变量必须赋值)),即保存默认初始值,但这样无意思,所以基本都会对静态成员变量赋值。

3)static修饰成员变量的应用场景: 如果一个数据需要被所有对象共享使用的时候,这时候即可使用static修饰。

2、static修饰成员函数

四、实例:
1、需求:统计一个类被使用了多少次创建对象,该类对外显示被创建的次数。
2、代码:

class Emp{    //静态的成员变量。    static int count = 0;   //计数器    //非静态成员变量    String name;    //构造代码块,如果有多个构造方法的时候,每个构造方法中都要有count++,为了简化代码使用了构造代码块    {        count++;    }    public Emp(String name){        this.name = name;    }    public Emp(){  //每创建一个对象的时候都会执行构造函数这里的代码    }    public void showCount(){        System.out.println("创建了"+ count+"个对象");    }}class Demo1{    public static void main(String[] args) {        Emp e1 = new Emp("土豆");        Emp e2 = new Emp();        Emp e3 =new Emp();        e3.showCount();    }}

3、结果:

0 0
原创粉丝点击