Java中的static关键字

ops/2024/10/20 20:00:20/

static 是 Java 中的一个关键字,
主要用于修饰类成员(变量和方法),
以表示这个成员属于类本身,而不是类的实例

1. 静态变量(Static Variables)

类级属性:静态变量也称为类变量或静态属性,它们在类加载时初始化,并且只有一份拷贝,被所有该类的对象共享。这意味着无论创建多少个对象,静态变量的内存空间只有一处。
生命周期长:静态变量的生命周期与类相同,只要应用运行,它们就存在。
访问方式:可以直接通过类名访问,而无需创建类的实例。例如,ClassName.staticVar。

概念:静态变量,也称为类变量,是类的一部分,而不仅仅是类的实例的一部分。这意味着无论你创建了多少个类的实例,这些实例都共享同一份静态变量。

举例:

java">public class Counter {static int count = 0; // 静态变量public Counter() {count++; // 每创建一个实例,count 加一}
}// 在某个地方
Counter c1 = new Counter();
Counter c2 = new Counter();System.out.println(Counter.count); // 输出 2,因为 c1 和 c2 共享同一个 count

System.out.println(Counter.count); // 输出 2,因为 c1 和 c2 共享同一个 count
为什么使用:静态变量在某些场景下特别有用,比如计数器、配置项等,它们不需要针对每个对象实例化一份。

2. 静态方法(Static Methods)

不依赖于实例:静态方法可以在没有实例的情况下调用。这意味着它们不依赖于任何对象的状态,无法访问实例变量(非静态变量),但可以访问静态变量。
调用方式:同样可以通过类名直接调用,如 ClassName.staticMethod()。

概念:静态方法是与类关联的,不受实例状态影响,也不需要实例就能调用的方法。

举例:

java">public class MathUtil {static double square(double x) {return x * x;}
}// 调用
double result = MathUtil.square(2.0);


为什么使用:当一个方法操作的是纯数据,不依赖于对象状态,或者用于辅助性的公共操作时,可以设计为静态方法。

3. 静态初始化块(Static Initialization Block)

执行时机:当类首次被加载时,静态初始化块会被执行一次。
用途:用于初始化静态变量或执行类级别的初始化工作。

概念:在类加载时就会执行的代码块,用于初始化静态变量。

举例:

java">public class Config {static String path;static {try {path = "config.properties"; // 静态初始化块} catch (Exception e) {path = "default.properties";}}
}


为什么使用:静态初始化块在类加载时执行,适合用来初始化静态变量,确保它们在类第一次使用时已经准备好。

4. 静态内部类(Static Nested Classes)

独立于外部类:静态内部类不依赖于外部类的实例,可以像普通类一样创建实例。
访问限制:可以访问外部类的静态成员,但不能直接访问非静态成员。

概念:内部类的一种形式,与外部类没有绑定关系,更像一个独立的类。

举例:

java">public class OuterClass {static class StaticInnerClass {void print() {System.out.println("Hello from static inner class.");}}
}// 在另一个地方
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.print();


为什么使用:静态内部类如果不需要访问外部类的非静态成员,则可以设计为静态内部类,它更灵活,可以像一个普通的类那样使用。

5. 静态导入(Static Import)

简化访问静态成员:通过 import static 语句,可以避免在代码中每次调用静态方法或变量时都带上类名。

概念:通过 import static 导入静态变量或方法,使代码更加简洁。

举例:

java">import static java.lang.Math.*;public class Main {public static void main(String[] args) {double result = sqrt(4.0); // 直接调用静态方法,无需前缀}
}


为什么使用:静态导入可以减少代码冗余,提高代码可读性和整洁度。但应适度使用,以免过多的静态导入造成命名冲突。

静态变量、静态方法和静态初始化块的示例

java">public class Example {static int count; // 静态变量static { // 静态初始化块count = 0;}public static void increment() { // 静态方法count++;}public static void main(String[] args) {Example.increment(); // 通过类名调用静态方法System.out.println(Example.count); // 直接通过类名访问静态变量}
}


这段代码展示了静态变量、静态方法和静态初始化块的使用。注意 increment 方法和 count 变量都可以在没有实例的情况下直接通过类名访问。


http://www.ppmy.cn/ops/127073.html

相关文章

Git的原理和使用(二)

1. git的版本回退 之前我们也提到过,Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本 回退的功能…

基于yolov8、yolov5的行人检测系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 , 直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有 GPU&#xff0…

86.【C语言】数据结构之链表的总体概述

目录 1.回顾顺序表的缺点 2.链表 链表定义 链表结构 一种典型的链表图:单向链表 一个单向链表的结点代码示例 遍历打印单向链表代码示例 注意 1.回顾顺序表的缺点 1.由文章85.【C语言】数据结构之顺序表的中间插入和删除及遍历查找可知,在顺序表中间插入或删除效率低下…

ufw 工具介绍

UFW(Uncomplicated Firewall)是 Ubuntu 提供的一个易于使用的防火墙配置工具,简化了 iptables 的复杂配置。它通过提供简单的命令来允许或拒绝网络流量规则,以保护你的服务器或系统。 下面详细介绍 UFW 命令及其选项。 1. UFW 基…

CTF(四)

导言: 本文主要讲述在CTF竞赛中,web类题目file_include。 靶场链接:攻防世界 (xctf.org.cn) 一,观察页面。 可以看到一段php代码。从则段代码中我们可以知道: 1,使用include引入check.php文件&#xff…

基于Spring Boot REST API设计指南

在构建现代Web应用程序时,RESTful API已成为一种标准,使得不同的应用程序能够通过HTTP协议进行通信,实现资源的创建、读取、更新和删除等操作。Spring Boot作为一个功能强大的框架,能够轻松创建RESTful API。本文将详细介绍如何在…

H5对接海康硬盘录像机视频简单说明

开发过程中使用HTML5(通常是通过Web技术栈,如HTML、CSS、JavaScript)与海康威视(Hikvision)的硬盘录像机(DVR)进行视频对接,通常涉及以下步骤: 获取DVR的RTSP流地址:海康威视DVR支持RTSP协议,你可以通过DVR的管理界面获取每个摄像头的RTSP流地址。 使用视频播放器库…

STM32中的RAM和ROM分别是什么

RAM(Random Access Memory,随机存取存储器)和ROM(Read-Only Memory,只读存储器)是计算机系统中的两种常见存储器类型,它们各自有不同的功能和用途。 1. RAM(内存) 定义…