📜  Java中的static关键字

📅  最后修改于: 2020-03-29 05:36:59             🧑  作者: Mango

static是Java中的不可访问修饰符,适用于以下情况:

  1. 变量
  2. 方法
  3. 嵌套类

要创建静态成员(块,变量,方法,嵌套类),请在其声明之前添加关键字static。将成员声明为静态成员后,可以在创建其类的任何对象之前对其进行访问,并且无需引用任何对象。例如,在下面的Java程序中,我们无需创建Test类的任何对象即可访问静态方法m1()

// Java展示无需创建Test类的任何对象即可访问静态方法m1()。
class Test
{
    // static方法
    static void m1()
    {
        System.out.println("来自m1");
    }
    public static void main(String[] args)
    {
          // 调用m1,无对象
           m1();
    }
}

输出:

来自m1

静态块Static blocks

如果您需要进行计算以初始化静态变量,则可以声明一个静态块,在首次加载该类时仅执行一次。考虑下面的Java程序,该程序演示了静态块的使用。

// Java展示如何使用静态块Static blocks
class Test
{
    // static变量
    static int a = 10;
    static int b;
    // 静态块Static blocks
    static {
        System.out.println("静态块Static blocks初始化.");
        b = a * 4;
    }
    public static void main(String[] args)
    {
       System.out.println("来自 main");
       System.out.println("a : "+a);
       System.out.println("b : "+b);
    }
}

输出:

静态块Static blocks初始化.
来自 main
a : 10
b : 40

有关静态块的详细文章,请参见静态块

静态变量

当变量声明为静态变量时,将创建该变量的单个副本并在类级别的所有对象之间共享。静态变量本质上是全局变量。该类的所有实例共享相同的静态变量。
静态变量的重点:

  • 我们只能在类级别创建静态变量。
  • 静态块和静态变量按照它们在程序中的顺序执行。

下面的Java程序演示了静态块和静态变量按照它们在程序中的顺序执行。

// Java程序,展示静态块static blocks和静态变量

class Test
{
    // static变量
    static int a = m1();
    // 静态块static blocks
    static {
        System.out.println("来自静态块static blocks");
    }
    // static方法
    static int m1() {
        System.out.println("来自 m1");
        return 20;
    }
    // static method(main !!)
    public static void main(String[] args)
    {
       System.out.println("a : "+a);
       System.out.println("来自 main");
    }
}

输出:

来自 m1
静态块static blocks
a : 20
来自 main

静态方法

static关键字声明方法时,称为静态方法。静态方法的最常见示例是main()方法 。如上所述,可以在创建其类的任何对象之前访问任何静态成员,并且无需引用任何对象。声明为static的方法具有以下限制:

  • 他们只能直接调用其静态方法。
  • 他们只能直接访问静态数据。
  • 他们不能以任何方式引用thissuper

以下是演示静态方法限制的Java程序。

// Java演示如何使用静态方法
class Test
{
    // static变量
    static int a = 10;
    // 对象变量
    int b = 20;
    // static方法
    static void m1()
    {
        a = 20;
        System.out.println("来自 m1");
         // 不能对非静态b创建一个reference
         b = 10; // 编译错误
         // 不能对非静态m2创建一个静态引用
         m2();  // compilation编译错误
         //  在static中,不能用super
         System.out.println(super.a); // 编译错误
    }
    // 实例方法
    void m2()
    {
        System.out.println("来自 m2");
    }
    public static void main(String[] args)
    {
        // main方法
    }
}

何时使用静态变量和方法

将静态变量用于所有对象共有的属性。例如,在“学生”类中,所有学生都使用相同的大学名称。使用静态方法来更改静态变量。
考虑以下Java程序,该程序说明了将static关键字与变量和方法一起使用。

// Java程序展示静态方法和变量
// Student class
class Student
{
    String name;
    int rollNo;
    // static变量
    static String cllgName;
    // static变量
    static int counter = 0;
    public Student(String name)
    {
        this.name = name;
        this.rollNo = setRollNo();
    }
    // 从静态变量counter中获取唯一的rollNo
    static int setRollNo()
    {
        counter++;
        return counter;
    }
    // static方法
    static void setCllg(String name){
        cllgName = name ;
    }
    // 实例方法
    void getStudentInfo(){
        System.out.println("名字 : " + this.name);
        System.out.println("rollNo : " + this.rollNo);
        // 访问静态变量
        System.out.println("cllgName : " + cllgName);
    }
}
// 测试代码
public class StaticDemo
{
    public static void main(String[] args)
    {
        // 调用静态方法,不用初始化对象
        Student.setCllg("XYZ");
        Student s1 = new Student("Alice");
        Student s2 = new Student("Bob");
        s1.getStudentInfo();
        s2.getStudentInfo();
    }
}

输出:

名字 : Alice
rollNo : 1
cllgName : XYZ
名字 : Bob
rollNo : 2
cllgName : XYZ


静态嵌套类:我们不能使用静态修饰符声明顶级类,但可以将嵌套类声明为静态。这种类型的类称为嵌套静态类。