为什么类中定义的某些成员变量需要加 static和final修饰?

672 阅读2分钟

为什么类中定义的某些成员变量需要加 static和final修饰?

public class DataSyncJob extends BaseQuartzJob {
   private static final String STR = "xxx";
   private String str = "xxx";
}

final 的作用

使用时再分配,分配后不可修改

确保某些内容是不可变的,即它们在定义后不能再被修改。

static 的作用

修饰的 变量/方法 属于类,编译阶段已经分配到堆

静态变量也就是被 static 关键字修饰的变量。它可以被类的所有实例共享,无论一个类创建了多少个对象,它们都共享同一份静态变量。即使创建多个对象,静态变量也只会被分配一次内存,这样可以节省内存。

静态变量/方法,静态变量/方法与类相关联。无论一个类创建了多少个实例,它的静态变量/方法只有一个副本。静态变量可以直接通过类名引用,也可以通过对象名引用。

解释

先给出4个例子

public class Test {
    private String str1 = "xxx";
    private static String str2 = "xxx";
    private final String str3 = "xxx";
    private static final String str4 = "xxx";

    public void test(){
        str1 = "update";
        str2 = "update";
        // str3 = "update"; // Cannot assign a value to final variable 'str3'
        // str4 = "update"; // Cannot assign a value to final variable 'str4'
    }

    public void print(){
        System.out.println("str1:" + str1);
        System.out.println("str2:" + str2);
        System.out.println("str3:" + str3);
        System.out.println("str4:" + str4);
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.test();
        test.print();
        System.out.println("str2 static:" + Test.str2);
        System.out.println("str4 static:" + Test.str4);
    }
}
str1:update
str2:update
str3:xxx
str4:xxx
str2 static:update
str4 static:xxx
  • 对于 str1str2
    • 都可修改,str2 属于静态变量`。
  • 对于 str1str3
    • str3final 修饰不可修改。
  • 对于 str1str4
    • str4final 修饰不可修改,被 static 修饰属于静态变量。组合起来就是我们所说的常量。