首页 > Java > java教程 > 正文

Static 关键字:解码 Java 中的静态变量

Susan Sarandon
发布: 2024-10-21 20:12:02
原创
982 人浏览过

Static Keyword: Decoding Static Variables in Java

欢迎回到Java 关键字基础系列!这篇文章主要是关于静态变量——Java 中的一个强大功能,允许您在同一类的多个对象之间共享数据。

我们将通过实践示例和见解来介绍静态变量的目的、行为和关键用例。在单独的帖子中,我们将深入研究静态方法以避免过多的内容让您不知所措。

这篇文章建立在之前文章中讨论的概念的基础上。我建议查看最终关键字和静态块,以更深入地了解此处涵盖的主题。


什么是静态变量?

静态变量属于类而不是单个实例。它在类的所有对象之间共享,并且在这些对象之间保留相同的值

主要特征

  1. 类级变量:由类的所有实例共享。
  2. 初始化一次:当类被 JVM 加载时。
  3. 内存位置:存储在方法区中。
  4. 访问:可以使用类名称对象引用(尽管首选类名称)来访问。

代码示例:动作中的静态变量

package keywords.static_keyword;

public class StaticVariables {

    // Static variable: Shared across all instances of the class
    // Automatically initialized to default value on class loading
    static int idCounter; // int default value -> 0

    // Static final variables
    // Must be initialized at declaration or in a static block
    static final String COMPANY_NAME = "TechCorp";
    static final String OFFICE_CODE;

    // Instance variables: Unique to each object
    int employeeId;
    String employeeName;

    // Static final variable Initialized in a static block
    static {
       // Default region: US
       String region = System.getProperty("user.region", "US");
        switch (region) {
            case "EU":
                regionalOfficeCode = "EU-01";
                break;
            case "APAC":
                regionalOfficeCode = "AP-11";
                break;
            default:
                regionalOfficeCode = "US-00";
        }
        System.out.println("Static Block Invoked: Office Code set to " +
        regionalOfficeCode);
    }

    // Constructor: Assigns a unique ID to each object
    public StaticVariables(String name) {
        this.employeeName = name;
        this.employeeId = ++idCounter; // Incrementing the shared counter
    }

    // Instance method
    // Displays instance details along with shared data(static variables)
    void displayEmployeeDetails() {
        System.out.println("Employee ID: " + employeeId + 
            ", Name: " + employeeName + 
            ", Company: " + COMPANY_NAME +
            ", Office Code: " + OFFICE_CODE);
    }

    public static void main(String[] args) {
        // Creating instances to observe static variable behavior
        StaticVariables emp1 = new StaticVariables("Alice");
        StaticVariables emp2 = new StaticVariables("Bob");

        emp1.displayEmployeeDetails();
        emp2.displayEmployeeDetails();

        // Accessing the static variable directly using the class name
        System.out.println("Total Employees: " + StaticVariables.idCounter);
    }
}
登录后复制
登录后复制

代码说明

输出:

Static Block Invoked: Office Code set to US-00
Employee ID: 1, Name: Alice, Company: TechCorp, Office Code: US-00
Employee ID: 2, Name: Bob, Company: TechCorp, Office Code: US-00
Total Employees: 2
登录后复制

演示的关键概念:

  1. 静态变量:

    • 在所有实例之间共享并在实例之间保留其值。
    • 示例:idCounter 跟踪已创建的员工数量。
  2. 静态最终变量

    • 其值被分配一次且永不改变的常量。
    • 示例:COMPANY_NAME 和 OFFICE_CODE。
  3. 静态块

    • 加载类时执行一次
    • 用于根据环境配置初始化OFFICE_CODE等复杂的静态变量。
  4. 实例变量和方法:

    • 每个实例都有唯一的employeeId 和employeeName 值。
  5. 对静态变量的类级访问

    • 使用类名访问 idCounter:
    package keywords.static_keyword;
    
    public class StaticVariables {
    
        // Static variable: Shared across all instances of the class
        // Automatically initialized to default value on class loading
        static int idCounter; // int default value -> 0
    
        // Static final variables
        // Must be initialized at declaration or in a static block
        static final String COMPANY_NAME = "TechCorp";
        static final String OFFICE_CODE;
    
        // Instance variables: Unique to each object
        int employeeId;
        String employeeName;
    
        // Static final variable Initialized in a static block
        static {
           // Default region: US
           String region = System.getProperty("user.region", "US");
            switch (region) {
                case "EU":
                    regionalOfficeCode = "EU-01";
                    break;
                case "APAC":
                    regionalOfficeCode = "AP-11";
                    break;
                default:
                    regionalOfficeCode = "US-00";
            }
            System.out.println("Static Block Invoked: Office Code set to " +
            regionalOfficeCode);
        }
    
        // Constructor: Assigns a unique ID to each object
        public StaticVariables(String name) {
            this.employeeName = name;
            this.employeeId = ++idCounter; // Incrementing the shared counter
        }
    
        // Instance method
        // Displays instance details along with shared data(static variables)
        void displayEmployeeDetails() {
            System.out.println("Employee ID: " + employeeId + 
                ", Name: " + employeeName + 
                ", Company: " + COMPANY_NAME +
                ", Office Code: " + OFFICE_CODE);
        }
    
        public static void main(String[] args) {
            // Creating instances to observe static variable behavior
            StaticVariables emp1 = new StaticVariables("Alice");
            StaticVariables emp2 = new StaticVariables("Bob");
    
            emp1.displayEmployeeDetails();
            emp2.displayEmployeeDetails();
    
            // Accessing the static variable directly using the class name
            System.out.println("Total Employees: " + StaticVariables.idCounter);
        }
    }
    
    登录后复制
    登录后复制

何时使用静态变量?

  1. 全局计数器:用于跟踪常见状态,例如ID生成器计数器
  2. 配置设置:存储保持不变的值,例如应用程序级配置
  3. 缓存:使用静态变量缓存经常使用的数据(注意正确管理内存)。

结论

在这篇文章中,我们探索了静态变量——一个支持跨实例共享状态的基本功能。了解静态变量有助于编写更高效的代码,特别是在管理需要在多个对象之间保持一致的数据时。

下一篇文章中,我们将深入研究静态方法,探索它们的行为、局限性和最佳实践。


相关帖子

  • Java 基础

  • 数组面试要点

  • Java 内存基础

  • 集合框架要点

编码快乐!

以上是Static 关键字:解码 Java 中的静态变量的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!