”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java 中“static”的魔力:一为所有,一切为一!

Java 中“static”的魔力:一为所有,一切为一!

发布于2024-11-06
浏览:698

The Magic of `static` in Java: One for All, and All for One!

老实说,当我们第一次遇到 static 关键字时,我们都会想:“这是什么魔法?” ?但别担心,我会用一种简单、深入、甚至有点有趣的方式来分解它!

想象一下你正在参加一个聚会?你和你所有的朋友都戴着帽子。但每个人都必须分享一顶帽子。这基本上就是 Java 中 static 关键字的作用!您不必为每个朋友创建一顶帽子(这可能会变得混乱),而是拥有一顶帽子属于该组 - -并且所有人都可以轮流佩戴它。

现在我们已经了解了这一点,让我们深入了解 static 在 Java 中的真正作用。


静态偶数是什么意思?

简单来说,当您在 Java 中使用 static 关键字时,您是在说,“嘿,这里的这个东西属于类本身,而不属于该类的任何特定对象。”

这意味着:

  1. 不需要对象:您不必创建对象来使用静态变量或方法。直接调用就可以了!
  2. 在所有对象之间共享:如果您创建对象,那么所有对象都共享相同的静态内容。一项改变会影响到所有人。就像全球派对帽?!

静态变量:派对帽?

静态变量就像每个人都共享的一顶帽子。如果你改变帽子(例如,在里面插一根羽毛),每个人都会看到变化。

例子:

class Party {
    static int numberOfGuests = 0; // static variable

    Party() {
        numberOfGuests  ;  // Increment the guest count every time someone joins the party
    }
}

public class Main {
    public static void main(String[] args) {
        Party guest1 = new Party();
        Party guest2 = new Party();
        Party guest3 = new Party();

        System.out.println(Party.numberOfGuests);  // Output: 3 ?
    }
}

在示例中,所有客人共享 numberOfGuests 变量。每个新客人都没有自己的客人数量(想象一下混乱!)。相反,每个人都会更新相同的计数。现在,无论有多少客人到达,都只有一个 numberOfGuests,并且属于派对类,不属于任何个人客人。


静态方法:披萨送货员?

静态方法就像聚会上的披萨送货员——你可以打电话给他们,他们会出现,而不需要邀请(对象)。不管你有多少个聚会,同一个披萨店员都会给所有人送披萨?你只要给披萨店(班级)打电话,他们就会出现!

例子:

class PizzaShop {
    static void deliverPizza() {
        System.out.println("Pizza delivered! ?");
    }
}

public class Main {
    public static void main(String[] args) {
        PizzaShop.deliverPizza();  // No need to create a PizzaShop object
    }
}

在上面的示例中,您不必创建 PizzaShop 对象来获取披萨。您直接从类中调用该方法。因为为什么你每次饿的时候都想开一家商店?


静态块:DJ 的声音检查?

派对开始前,DJ 会进行声音检查,对吗?这有点像静态块。它会在发生任何其他事情之前运行一次,以确保一切就位。

例子:

class Party {
    static String music;

    // Static block to set up the DJ's playlist ?
    static {
        music = "Let's Dance by David Bowie";
        System.out.println("Music is set up: "   music);
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("Party is starting with: "   Party.music);
    }
}

静态块在任何一方开始之前执行。音乐是提前设置好的,所以当客人到来时,他们已经开始兴奋了?.


静态嵌套类:VIP 区域?

静态嵌套类就像聚会上的 VIP 部分。它们位于主活动内部,但它们是独立的 - 您无需创建派对即可访问 VIP 部分。

例子:

class Party {
    static class VIPArea {
        void exclusiveService() {
            System.out.println("Welcome to the VIP area! ?");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Party.VIPArea vip = new Party.VIPArea();  // No need for a Party object
        vip.exclusiveService();  // Output: Welcome to the VIP area! ?
    }
}

尽管 VIP 区域是聚会的一部分,但您不需要一个成熟的聚会来使用它。它独立存在——有点像激烈活动中的一个凉爽、安静的贵宾休息室。


为什么使用静态?

现在,您可能会想,“这很酷,但是我什么时候应该真正使用静态?” 那么,这是备忘单:

  1. 对于常量:永远不会改变的东西(如 Pi)。对常量使用 static final,例如 static final double PI = 3.14159;
  2. 对于实用方法:不依赖于任何对象状态的函数。想想 Math.pow().
  3. 对于共享数据:当一个类的所有实例都应该共享一个值时,比如计算某个东西被创建了多少次。
  4. 为了提高效率:当你不需要一个对象时,避免创建一个对象。只需使用静态方法或变量即可!

幕后:静态如何工作? ️

好吧,是时候看看幕后了。奇迹是这样发生的:

  1. 内存管理:静态变量和方法位于内存的方法区(而不是对象所在的堆中)。这意味着它们在类首次加载时被加载一次,并且它们一直保留在那里直到程序结束。
  2. 初始化:静态变量和块在类加载到内存中时初始化(而不是在创建对象时)。因此,它们在制作任何对象之前就可以使用了。
  3. 访问:不需要对象来访问静态变量或方法,因为它们属于类,而不属于任何特定对象。

这就像在客人到达之前摆好小吃桌一样。您不必要求每位客人自带食物 - 他们只需自助享用共享的零食即可?.


注意:不要过度! ?

像大多数事情一样,过多的静电可能是一件坏事。以下是一些警告:

  • 没有对象,无法访问非静态内容:静态方法无法访问非静态(实例)变量或方法,因为它们属于类,而不是对象。换句话说,披萨师傅无法帮助你选择播放列表——他只处理披萨?.
  • 线程安全:如果多个线程修改同一个静态变量,事情可能会变得混乱(除非你处理同步)。想象一下两个客人争夺同一顶帽子——混乱就会随之而来! ?

总结:静态概述

Java 中的 static 关键字就像派对上的 DJ、披萨店员和 VIP 休息室 — 它使一切变得更顺畅、更高效,并在所有客人之间共享。无论您是在处理实用方法、共享数据,还是只是想节省内存,静态都是您的朋友。

但是记住,不要把一切都变成静态的混战!明智地使用它,你的代码将会干净、高效、无混乱?.


就是这样!现在您准备好像专业人士一样放弃一些静态知识了吗?.


版本声明 本文转载于:https://dev.to/akshay_gengaje/the-magic-of-static-in-java-one-for-all-and-all-for-one-1j0o?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 关于测试覆盖率的真相
    关于测试覆盖率的真相
    一个强有力的真理。 看下面这段简单明了的代码: function sum(a, b) { return a b; } 现在,让我们为它编写一些测试: test('sum', () => { expect(sum(1, 2)).toBe(3); expect(s...
    编程 发布于2024-11-06
  • 为什么我的 OpenGL 三角形无法在 Go 中渲染?调查顶点缓冲区问题。
    为什么我的 OpenGL 三角形无法在 Go 中渲染?调查顶点缓冲区问题。
    Go 中的 OpenGL 顶点缓冲区问题在尝试在 Go 中使用 OpenGL 显示三角形时,用户遇到了顶点缓冲区问题缓冲区无法渲染形状。 Go 代码源自教程,但与 C 代码不同的是,它没有产生任何输出。问题原因问题的根本原因位于传递给 vertexAttrib.AttribPointer() 的参数...
    编程 发布于2024-11-06
  • 为什么在 Linux 32 位发行版上的 Go 程序中设置 `ulimit -n` 会导致“参数无效”错误?
    为什么在 Linux 32 位发行版上的 Go 程序中设置 `ulimit -n` 会导致“参数无效”错误?
    如何在 Go 程序中设置 ulimit -n?问题用户尝试在 Go 程序中设置 ulimit -n使用 setrlimit 和 getrlimit 系统调用将其限制在程序内而不是全局。然而,在尝试设置该值时出现错误,提示“参数无效”。解决方案发现该问题是由于 Linux 32 的 Getrlimit...
    编程 发布于2024-11-06
  • 如何在Python中创建无限深度的动态嵌套字典?
    如何在Python中创建无限深度的动态嵌套字典?
    未定义深度的动态嵌套字典在涉及复杂多级数据结构的场景中,经常会遇到变量嵌套字典的需求水平。虽然硬编码插入语句是一种潜在的解决方案,但当事先未知嵌套深度时,这种方法是不切实际的。要克服此限制,请考虑利用 Python 的 collections.defaultdict,它允许动态创建字典。可以使用以下...
    编程 发布于2024-11-06
  • Python 变得强大:轻松编程的初学者指南
    Python 变得强大:轻松编程的初学者指南
    Python 是一门强大的编程语言,语法简单,应用广泛。安装 Python 后,可以学习其基本语法,包括变量赋值、数据类型和流程控制。实战案例中,我们通过蒙特卡罗模拟计算圆周率,展示了 Python 在数值计算中的能力。此外,Python 拥有丰富的库,涵盖机器学习、数据分析和网络开发等领域,体现了...
    编程 发布于2024-11-06
  • 如何在没有 jQuery 的情况下监听动态创建的元素的事件?
    如何在没有 jQuery 的情况下监听动态创建的元素的事件?
    在没有 jQuery 的情况下监听动态创建的元素的事件使用外部页面时,向动态生成的元素添加事件监听器可能具有挑战性。在这种情况下,委派事件处理至关重要。一种方法是使用 event.target 属性来检查单击或触发的元素是否属于所需类型。这是一个示例:document.querySelector('...
    编程 发布于2024-11-06
  • 利用 Snipbyte 的高级考勤管理系统优化劳动力效率
    利用 Snipbyte 的高级考勤管理系统优化劳动力效率
    在当今的商业环境中,有效管理员工出勤、轮班和工资单可以决定组织的成功或失败。准确的考勤跟踪不仅可以确保运营顺利进行,还有助于提高生产力。在 Snipbyte,我们专注于提供一流的基于网络的解决方案来增强业务流程,包括我们的高级考勤管理系统。 为什么选择Snipbyte的考勤管理系统? 我们的考勤管理...
    编程 发布于2024-11-06
  • Laravel Auth 路由教程
    Laravel Auth 路由教程
    Laravel auth routes is one of the essential features of the Laravel framework. Using middlewares you can implement different authentication strategies...
    编程 发布于2024-11-06
  • 如何有效地跳转到大型文本文件中的特定行?
    如何有效地跳转到大型文本文件中的特定行?
    优化大型文本文件中的跳行:另一种方法处理具有不同长度行的大量文本文件时,通常效率很低顺序读取每一行以达到特定的行号。问题中提供的代码示例说明了这种方法,需要对整个文件进行可能缓慢的迭代。然而,还有一种替代方法可以通过利用计算出的偏移列表来优化跳线。基于偏移的跳线要克服这一挑战,需要一种更有效的方法涉...
    编程 发布于2024-11-06
  • 如何在 JavaScript 中检索 HTML 元素的 CSS 属性值?
    如何在 JavaScript 中检索 HTML 元素的 CSS 属性值?
    在 JavaScript 中获取 HTML 元素的 CSS 属性值在 Web 开发中,动态操作 CSS 属性可以增强用户体验和界面。使用 JavaScript,访问这些属性非常简单。在您的场景中,CSS 文件链接到 HTML 页面,您需要检索类名为“的 div 的特定属性(例如颜色)”布局。”以下是...
    编程 发布于2024-11-06
  • PLSQL 中的 DBMS_OUTPUT.PUT_LINE
    PLSQL 中的 DBMS_OUTPUT.PUT_LINE
    在 Oracle PL/SQL 中,打印输出的方法是使用 DBMS_OUTPUT.PUT_LINE 过程。该过程将文本写入控制台或输出缓冲区,如果启用了 DBMS_OUTPUT,则可以在执行后查看文本。使用方法如下: 首先,在 SQL 环境(如 SQL*Plus 或 Oracle SQL Devel...
    编程 发布于2024-11-06
  • 利用 Python 实现自动化:用代码简化日常任务
    利用 Python 实现自动化:用代码简化日常任务
    介绍 Python 已成为从 Web 开发到数据科学等各种应用程序的首选语言。 Python 真正大放异彩的领域之一是自动化。无论您是希望自动化平凡的任务、简化工作流程,还是创建强大的脚本来节省时间和精力,Python 的简单性和多功能性都使其成为完成这项工作的完美工具。 ...
    编程 发布于2024-11-06
  • 如何在 Python 中传递参数来应用 Pandas 系列的函数?
    如何在 Python 中传递参数来应用 Pandas 系列的函数?
    Python Pandas 中向 Series Apply 函数传递参数pandas 库提供了 'apply()' 方法将函数应用于 Series 的每个元素。然而,旧版本的 pandas 不允许向函数传递额外的参数。旧版本 Pandas 的解决方案:在旧版本中处理此限制pandas...
    编程 发布于2024-11-06
  • 如何使用 Java 8 Lambda 按多个字段有效地对集合进行排序?
    如何使用 Java 8 Lambda 按多个字段有效地对集合进行排序?
    使用 Java 8 Lambda 对具有多个字段的集合进行排序提供的排序代码似乎不完整,可能不会产生预期的排序顺序。让我们深入研究使用 Java 8 lambda 的更高效、更全面的方法。使用 Java 8 lambda 的Java 8 通过提供直观的 lambda 表达式来简化列表排序,这些表达式...
    编程 发布于2024-11-06
  • 开发人员如何使用 JavaScript 在 HTML 页面之间安全地交换数据?
    开发人员如何使用 JavaScript 在 HTML 页面之间安全地交换数据?
    在 JavaScript 中维护 HTML 页面之间的数据完整性在网页之间传输数据时,使用查询参数的传统方法(例如“http://localhost/ project/index.html?status=exist") 可能会在 URL 中暴露敏感信息。为了解决这个问题,开发人员寻求安全交...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3