为什么在Java中使用静态变量

117 阅读6分钟

你可以在Java程序的不同部分使用static 关键字,如变量、方法和静态块。

在Java中使用static 关键字的主要目的是为了节省内存。当我们在一个将被其他类访问的类中创建一个变量时,我们必须首先创建一个类的实例,然后给每个变量实例分配一个新的值--即使新变量的值在所有新的类/对象中应该是一样的。

但是当我们创建一个静态变量时,它的值在所有其他类中保持不变,而且我们不必创建一个实例来使用该变量。这样一来,我们只是创建了一次变量,所以内存只分配了一次。

通过后面几节的例子,你会更好地理解这一点。

为了理解static 关键字是什么以及它的实际作用,我们将看到一些例子,显示它在Java中声明静态变量、方法和块时的用途。

如何在Java中创建一个静态变量

为了理解static 关键字在创建变量中的用途,让我们看看创建在一个类的每个实例中共享的变量的通常方式:

class Student {
    String studentName; 
    String course; 
    String school;
        
    public static void main(String[] args) {
        Student Student1 = new Student();
        Student Student2 = new Student();
        
        Student1.studentName = "Ihechikara";
        Student1.course = "Data Visualization";
        Student1.school = "freeCodeCamp";
        
        Student2.studentName = "John";
        Student2.course = "Data Analysis with Python";
        Student2.school = "freeCodeCamp";
        
        System.out.println(Student1.studentName + " " + Student1.course + " " + Student1.school + "\n");
        // Ihechikara Data Visualization freeCodeCamp
        System.out.println(Student2.studentName + " " + Student2.course + " " + Student2.school);
        // John Data Analysis with Python freeCodeCamp
    }
}

我将逐步解释上面的代码中所发生的事情。

我们创建了一个名为Student 的类,有三个变量--studentNamecourse ,和school

然后我们创建了Student 类的两个实例:

Student Student1 = new Student();
Student Student2 = new Student();

第一个实例--Student1 --可以访问在其类中创建的变量,它有这些值:

Student1.studentName = "Ihechikara";
Student1.course = "Data Visualization";
Student1.school = "freeCodeCamp";

第二个实例有这些值:

Student2.studentName = "John";
Student2.course = "Data Analysis with Python";
Student2.school = "freeCodeCamp";

如果你仔细观察,你会发现这两个学生有相同的学校名称--"freeCodeCamp"。如果我们要为同一所学校创建100个学生呢?这意味着我们要用相同的值初始化一个变量100次--每次都要分配新的内存。

虽然这看起来不是一个问题,但在一个更大的代码库中,它可能成为一个缺陷,并不必要地减慢你的程序。

为了解决这个问题,我们将使用static 关键字来创建school 这个变量。之后,该类的所有实例都可以利用该变量。

下面是方法:

class Student {
    String studentName; 
    String course; 
    static String school;
        
    public static void main(String[] args) {
        Student Student1 = new Student();
        Student Student2 = new Student();
        
        
        Student1.studentName = "Ihechikara";
        Student1.course = "Data Visualization";
        Student1.school = "freeCodeCamp";
        
        
        Student2.studentName = "John";
        Student2.course = "Data Analysis with Python";
        
        System.out.println(Student1.studentName + " " + Student1.course + " " + Student1.school + "\n");
        // Ihechikara Data Visualization freeCodeCamp
        System.out.println(Student2.studentName + " " + Student2.course + " " + Student2.school);
        // John Data Analysis with Python freeCodeCamp
    }
}

在上面的代码中,我们创建了一个名为school 的静态变量。你会注意到,static 关键字在数据类型和变量名称的前面:static String school = "freeCodeCamp";

现在,当我们创建一个新的类的实例时,我们不需要为每个实例初始化school 。在我们的代码中,我们只给第一个实例的变量赋值,第二个实例也继承了这个变量。

请注意,在代码中的任何地方改变静态变量的值,都会覆盖代码中其他部分的值,因为这些部分之前是声明的。

所以你应该只对那些应该在程序中保持不变的变量使用static 关键字。

你也可以在创建变量时给它赋值,这样你就不必在创建类实例时再次声明它:static String school = "freeCodeCamp";

如果你使用上面的方法,你就会有这个效果:

class Student {
    String studentName; 
    String course; 
    static String school = "freeCodeCamp";
        
    public static void main(String[] args) {
        Student Student1 = new Student();
        Student Student2 = new Student();
        
        
        Student1.studentName = "Ihechikara";
        Student1.course = "Data Visualization";
        
        Student2.studentName = "John";
        Student2.course = "Data Analysis with Python";
        
        System.out.println(Student1.studentName + " " + Student1.course + " " + Student1.school + "\n");
        // Ihechikara Data Visualization freeCodeCamp
        System.out.println(Student2.studentName + " " + Student2.course + " " + Student2.school);
        // John Data Analysis with Python freeCodeCamp
    }
}

在最后一节,你将看到如何使用静态块来初始化静态变量。

如何在Java中创建一个静态方法

在我们看一个例子之前,这里有一些你应该知道的关于Java中静态方法的事情:

  • 静态方法只能 访问和修改静态变量。
  • 静态方法可以被调用/使用,而不需要创建一个类实例。

这里有一个例子来帮助你理解:

class EvenNumber {
    
    static int evenNumber;
    
    static void incrementBy2(){
        evenNumber = evenNumber + 2;
        System.out.println(evenNumber);
    }
        
    public static void main(String[] args) {
        incrementBy2(); // 2
        incrementBy2(); // 4
        incrementBy2(); // 6
        incrementBy2(); // 8
    }
}

在上面的代码中,我们在一个叫做EvenNumber 的类中创建了一个整数 (evenNumber) 。

我们的静态方法被命名为incrementBy2() 。这个方法增加了evenNumber 整数的值并打印出它的值。

在没有创建类实例的情况下,我们能够在程序的main 方法中调用incrementBy2() 方法。每次我们调用该方法时,evenNumber 的值都会增加2并打印出来。

你也可以在调用方法时使用点符号将类的名称附加到方法上:EvenNumber.incrementBy2(); 。每个静态方法都属于类,而不是类的实例。

如何在Java中创建一个静态块

Java中的静态块类似于构造函数。我们可以用它们来初始化静态变量,而且它们会在main 方法之前被编译器执行:

class Block {
    
    static int year;
    
    static {
        year = 2022;
        System.out.println("This code block got executed first");
    }
        
    public static void main(String[] args) {
        
        System.out.println("Hello World");
        System.out.println(year);
    }
}

在上面的代码中,我们创建了一个静态整数变量year 。然后我们在一个静态块中初始化了它:

static {
        year = 2022;
        System.out.println("This code block got executed first");
    }

你可以创建一个静态块,正如你在上面看到的,使用static 关键字,后面是大括号。在我们代码中的静态块中,我们用2022的值初始化了year 这个变量。我们还打印出了一些文本--"这个代码块首先被执行"。

main 方法中,我们打印了 "Hello World "和静态变量year

在控制台中,代码将按照这个顺序执行:

This code block got executed first
Hello World
2022

这说明了静态块中的代码是如何在main 方法之前首先被执行的。

总结

在这篇文章中,我们谈到了Java中的static 关键字。它是一个主要帮助我们在Java程序中优化内存的关键字。

我们通过实例了解了如何创建静态变量和方法。

最后,我们谈到了静态块,你可以用它来初始化静态变量。静态块在主方法之前被执行。

编码愉快!