首页 > Java > java教程 > 正文

Static 关键字:访问方法中的静态和非静态成员

DDD
发布: 2024-10-25 00:39:30
原创
830 人浏览过

Static Keyword: Accessing Static and Non-Static Members in Methods

在这篇文章中,我们将重点关注方法如何与静态和非静态成员交互以及为什么静态局部变量不是允许。这是一个常见的面试话题,也是 Java 开发人员的一个重要概念。

这篇文章建立在本系列之前的文章中涵盖的概念的基础上。如果您不熟悉 static 关键字,我建议您先查看静态块和静态变量以获得更好的基础,然后再深入讨论此处讨论的主题。


静态方法和成员概述

  • 静态成员(变量或方法)属于而不是该类的实例。
  • 非静态成员 绑定到特定的对象 并且对每个实例都是唯一的。

由于静态方法在类级别操作,因此它们无法直接访问实例成员。


演示静态和非静态访问的程序:

package keywords.static_keyword;

public class StaticVariables {

    // Static and non-static variables
    static int idStatic = 1;  // Shared across all instances
    int id;                   // Unique to each instance
    String name;              // Unique to each instance

    // Static block – Runs once when the class is loaded
    static {
        displayStatic();  // Call to static method

        // Cannot access non-static method in static block
        display(); // --> Compilation error
    }

    // Constructor to initialize non-static variables
    public StaticVariables(String name) {
        this.id = ++idStatic;  // Increment static ID for every new instance
        this.name = name;
    }

    // Non-static method: Can access both static and non-static members
    void display() {
        System.out.println("Instance Method:");
        System.out.println("Static ID: " + idStatic + ", Instance ID: " +
        id + ", Name: " + name);
    }

    // Static method: Can only access static members directly
    static void displayStatic() {
        System.out.println("Static Method:");
        System.out.println("Static ID: " + idStatic);

        // Static local variables are not allowed
        static int localVar = 10; // --> Compilation error
    }

    public static void main(String[] args) {
        // Call static method directly
        displayStatic();

        // Create instances to access non-static methods
        StaticVariables obj1 = new StaticVariables("Object1");
        StaticVariables obj2 = new StaticVariables("Object2");

        // Access non-static methods through objects
        obj1.display();
        obj2.display();
    }
}
登录后复制
登录后复制

关键概念和访问规则

1.为什么 Java 中不允许使用静态局部变量?

Java 不允许在方法或块中使用静态局部变量

  • 原因:
    • 局部变量属于方法的堆栈帧,并在调用方法时创建。
    • 但是,静态变量是类级别成员,并且应该可以在整个类生命周期中访问。
    • 在方法中允许静态变量会导致矛盾,因为方法的局部变量与方法的执行相关的寿命很短。
package keywords.static_keyword;

public class StaticVariables {

    // Static and non-static variables
    static int idStatic = 1;  // Shared across all instances
    int id;                   // Unique to each instance
    String name;              // Unique to each instance

    // Static block – Runs once when the class is loaded
    static {
        displayStatic();  // Call to static method

        // Cannot access non-static method in static block
        display(); // --> Compilation error
    }

    // Constructor to initialize non-static variables
    public StaticVariables(String name) {
        this.id = ++idStatic;  // Increment static ID for every new instance
        this.name = name;
    }

    // Non-static method: Can access both static and non-static members
    void display() {
        System.out.println("Instance Method:");
        System.out.println("Static ID: " + idStatic + ", Instance ID: " +
        id + ", Name: " + name);
    }

    // Static method: Can only access static members directly
    static void displayStatic() {
        System.out.println("Static Method:");
        System.out.println("Static ID: " + idStatic);

        // Static local variables are not allowed
        static int localVar = 10; // --> Compilation error
    }

    public static void main(String[] args) {
        // Call static method directly
        displayStatic();

        // Create instances to access non-static methods
        StaticVariables obj1 = new StaticVariables("Object1");
        StaticVariables obj2 = new StaticVariables("Object2");

        // Access non-static methods through objects
        obj1.display();
        obj2.display();
    }
}
登录后复制
登录后复制

2.静态方法

  • 可以直接访问静态变量和其他静态方法。
  • 无法直接访问非静态成员(因为静态上下文中不存在对象)。

3.非静态方法

  • 可以访问静态和非静态成员
  • 存在这种灵活性是因为非静态方法属于对象实例,使它们能够访问类级和实例级数据。

4.静态块

  • 当 JVM 加载类时执行一次
  • 可以调用静态方法,但不能直接调用非静态方法,因为此时没有可用的对象。

程序输出

static void displayStatic() {
    static int localVar = 10; // --> Compilation error
}
登录后复制

规则摘要

Context Access Static Members Access Non-Static Members Allow Static Local Variables?
Static Method Yes No No
Non-Static Method Yes Yes No
Static Block Yes No No
上下文 访问静态成员 访问非静态成员 允许静态局部变量吗? 标题> 静态方法 是 否 否 非静态方法 是 是 否 静态块 是 否 否 表>

何时使用静态方法?

  • 实用程序或辅助函数: 例如,Math.pow()。
  • 当不需要实例数据时: 独立于对象状态的操作。

结论

静态方法和成员是Java中必不可少的工具。以下是主要要点:

  • 静态方法在类级别操作,只能直接访问静态成员。
  • 非静态方法 可以访问静态和非静态成员。
  • 由于方法作用域和静态生命周期之间的冲突,Java 中不允许使用静态局部变量

通过理解这些规则,您将能够在程序中有效地使用静态方法。


相关帖子

  • Java 基础知识

  • 数组面试要点

  • Java 内存基础

  • 集合框架要点

编码快乐!

以上是Static 关键字:访问方法中的静态和非静态成员的详细内容。更多信息请关注PHP中文网其他相关文章!

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