教妹学Java(二十六):static 关键字解析(1)-阿里云开发者社区

开发者社区> 沉默王二> 正文

教妹学Java(二十六):static 关键字解析(1)

简介: 教妹学Java(二十六):static 关键字解析
+关注继续查看

三妹开学了,学的计算机软件编程。她学校离我家很近,坐公交车也就 10 站路的距离, 每逢周末她都会来找我,让我辅导她学习 Java。作为一名拥有十余年编程经验的程序员,再加上父母给我们的这份血缘关系,我觉得义不容辞。


“二哥,今天我们要学习的内容是‘static 关键字’,对吧?”看来三妹已经提前预习了我上次留给她的作业。


“是的,三妹。Java 中的 static 关键字主要用于内存管理。 ”我面带着朴实无华的微笑回答着她,“我们可以将 static 关键字和变量、方法、代码块、内部类一起使用。”


----正儿八经的分割线,正文开始------------


01、什么是静态变量


如果在声明变量的时候使用了 static 关键字,那么这个变量就被称为静态变量。静态变量只在类加载的时候获取一次内存空间,这使得静态变量很节省内存空间。


考虑这样一个 Student 类:


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class Student {
    String name;
    int age;
    String school = "郑州大学";
}



假设郑州大学录取了一万名新生,那么在创建一万个 Student 对象的时候,所有的字段(name、age 和 school)都会获取到一块内存。学生的姓名和年纪不尽相同,但都属于郑州大学,如果每创建一个对象,school 这个字段都要占用一块内存的话,就很浪费,对吧?因此,最好将 school 这个字段设置为 static,这样就只会占用一块内存,而不是一万块。


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class Student {
    String name;
    int age;
    static String school = "郑州大学";
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public static void main(String[] args) {
        Student s1 = new Student("沉默王二", 18);
        Student s2 = new Student("沉默王三", 16);
    }
}



s1 和 s2 两个变量存放在栈区(stack),“沉默王二”+18 这个对象和“沉默王三”+16 这个对象存放在堆区(heap),school 这个静态变量存放在静态区,内存关系图如下所示。


image.png


再来看另外一个例子,我们创建一个实例变量 count,并且在构造函数中自增。因为实例变量会在创建对象的时候获取内存,因此每一个对象都会有一个 count 的副本, count 的值并不会随着对象的增多而递增。


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class Counter {
    int count = 0;
    Counter() {
        count++;
        System.out.println(count);
    }
    public static void main(String args[]) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();
    }
}



想一下,count 的值会是几呢?来看一下程序的输出结果。


1

1

1



每创建一个 Counter 对象,count 的值就从 0 自增到 1。那如果 count 是静态的呢?


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class StaticCounter {
    static int count = 0;
    StaticCounter() {
        count++;
        System.out.println(count);
    }
    public static void main(String args[]) {
        StaticCounter c1 = new StaticCounter();
        StaticCounter c2 = new StaticCounter();
        StaticCounter c3 = new StaticCounter();
    }
}



这次输出结果又是多少呢?来看一下。


1

2

3


由于静态变量只会获取一次内存空间,所以任何对象对它的修改都会得到保留。



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9143 0
php中static关键字的理解
函数内的static变量static静态变量的理解 静态变量 类型说明符是static。 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。
870 0
当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。 但 static的方法直接用类名调用就行!
当类中的方法全部都是 static 关键字修饰时 ,它的构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象去调用,需要调用构造方法。 但 static的方法直接用类名调用就行! -----------------------------------------------------------------------------static关键字的特点   A:static关键字的特点     a:随着类的加载而加载     b:优先于对象存在     c:被类的所有对象共享       举例:咱们班级的学生应该共用同一个班级编号。
926 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10739 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12843 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载