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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 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


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



相关文章
|
4天前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
14 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
7天前
|
监控 算法 Java
深入解析Java中的垃圾回收机制
本文旨在全面解析Java的垃圾回收机制,探讨其工作原理、常见算法以及在实际开发中的应用。通过对这一重要主题的深入分析,希望帮助读者更好地理解Java虚拟机(JVM)如何管理内存,从而编写出更高效、稳定的Java应用程序。
|
7天前
|
Java 开发者
Java中的异常处理机制深度解析
在Java编程中,异常处理是保证程序稳定性和健壮性的重要手段。本文将深入探讨Java的异常处理机制,包括异常的分类、捕获与处理、自定义异常以及一些最佳实践。通过详细讲解和代码示例,帮助读者更好地理解和应用这一机制,提升代码质量。
12 1
|
8天前
|
分布式计算 Java API
深入解析Java中的Lambda表达式及其应用
本文将深入探讨Java中Lambda表达式的定义、优势及其在实际编程中的应用。通过具体示例,帮助读者更好地理解和使用这一强大的编程工具。
|
存储 Java 数据库
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
59 1
|
Java 编译器
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
61 1
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
|
存储 Java 编译器
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(下)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(下)
49 0
|
存储 Java 编译器
【Java SE】static成员及代码块
【Java SE】static成员及代码块
【Java SE】static成员及代码块
|
存储 Java
Java之static成员与代码块
本篇文章主要介绍JavaSE中一些不是很常见的知识点,但也会涉及,需要了解一下
115 0
Java之static成员与代码块
|
存储 设计模式 安全
Java SE基础知识详解第[7]期—面向对象进阶(static、单例、代码块、继承)
Java SE基础知识详解第[7]期—面向对象进阶(static、单例、代码块、继承)
Java SE基础知识详解第[7]期—面向对象进阶(static、单例、代码块、继承)

推荐镜像

更多
下一篇
无影云桌面