Java中加静态关键字为什么称为唯一了?

在Java中,static关键字可以用于修饰类的成员变量和方法。它的主要作用是将成员变量和方法与对象实例解耦,使其成为类的共享资源。这种特性使得static关键字被称为“唯一了”,下面我们来详细探讨一下为什么会这样。

1. 静态成员变量

静态成员变量是指被static关键字修饰的类的成员变量。与实例变量不同,它属于类本身而不是类的实例。这意味着无论创建多少个类的实例,静态变量只会存在一份内存。当我们修改一个静态变量的值时,所有对该变量的引用都会受到影响。

public class StaticVariableExample {
    static int count = 0;
    
    public StaticVariableExample() {
        count++;
    }
    
    public static void main(String[] args) {
        StaticVariableExample obj1 = new StaticVariableExample();
        System.out.println("Count: " + obj1.count); // 输出结果:Count: 1
        
        StaticVariableExample obj2 = new StaticVariableExample();
        System.out.println("Count: " + obj2.count); // 输出结果:Count: 2
    }
}

在上面的例子中,我们创建了两个StaticVariableExample类的实例,并访问了它们的静态成员变量count。由于每次创建实例时都会进行count++操作,所以count的值会递增。

2. 静态方法

静态方法是指被static关键字修饰的类的方法。与实例方法不同,静态方法可以直接通过类名来调用,无需创建类的实例。这使得静态方法成为了工具类方法的理想选择。

public class StaticMethodExample {
    public static int sum(int a, int b) {
        return a + b;
    }
    
    public static void main(String[] args) {
        int result = StaticMethodExample.sum(3, 4);
        System.out.println("Sum: " + result); // 输出结果:Sum: 7
    }
}

在上面的例子中,我们定义了一个静态方法sum,它接受两个整数参数并返回它们的和。我们可以直接通过类名来调用这个静态方法,而无需创建类的实例。

3. 静态块

静态块是指被static关键字修饰的代码块。它在类加载时执行,并且只执行一次。静态块常用于初始化静态成员变量或执行一些需要提前做的操作。

public class StaticBlockExample {
    static int count;
    
    static {
        count = 10;
        System.out.println("Static block executed.");
    }
    
    public static void main(String[] args) {
        System.out.println("Count: " + count); // 输出结果:Count: 10
    }
}

在上面的例子中,我们定义了一个静态块,并在其中给静态成员变量count赋值为10。在main方法中,我们打印了count的值,可以看到静态块在类加载时执行且只执行一次。

总结

静态关键字在Java中具有许多有用的特性。通过将成员变量和方法标记为静态,我们可以实现变量和方法的共享,并且可以通过类名直接访问静态成员。这种将成员与实例解耦的方式使得静态关键字被称为“唯一了”。

stateDiagram
    [*] --> StaticVariableExample
    StaticVariableExample --> StaticVariableExample : count++
    StaticVariableExample --> [*]
stateDiagram
    [*] --> StaticMethodExample
    StaticMethodExample --> [*]
stateDiagram
    [*] --> StaticBlockExample : class loading
    StaticBlockExample --> [*]

参考资料:

  • [Java static keyword](