Java中的static关键字

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 变量都可以在没有实例的情况下直接通过类名访问。

相关推荐
锦***林14 分钟前
用 Python 写一个自动化办公小助手
开发语言·python·自动化
陈小桔36 分钟前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!37 分钟前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg36781 小时前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July1 小时前
Hikari连接池
java
微风粼粼1 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad1 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud
立志成为大牛的小牛1 小时前
数据结构——二十六、邻接表(王道408)
开发语言·数据结构·c++·学习·程序人生
天若有情6732 小时前
Spring MVC文件上传与下载全面详解:从原理到实战
java·spring·mvc·springmvc·javaee·multipart
祈祷苍天赐我java之术2 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap