浅谈 Java 常量和静态变量

EmiyaCC 于 2021-07-23 发布

Java 常量和静态变量

摘录于 Java静态变量与常量- 知乎

static 修饰的成员变量或者成员方法习惯上称之为静态变量或静态方法,可以直接通过类名来访问,只要这个类被加载,JVM 就可以根据类名在运行时数据区的方法区找到他们。因此 static 修饰的变量和方法,可以在它所属的对象创建之前访问,不用创建对象。

静态变量

访问语法为:

类名.静态方法名(参数列表) 类名.静态变量名

按照是否静态的对类成员变量进行分类可分为两种:

静态变量与实例变量的区别:

  1. 静态变量在内存中只有一个拷贝(节省内存), JVM只为静态分配一次内存。在加载类的过程中完成静态变量的内存分配。 可用类名直接访问,当然也可以通过对象来访问(不推荐)。
  2. 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响,需要通过实例的引用来访问。
  3. 在定义静态变量时,通常将所有的字母大写,与实例变量做区分

静态变量应用场景:

静态方法

静态方法可以直接通过类名调用,任何的实例也可以调用。因此静态方法只能访问所属类的静态变量和静态方法,不能用 thissuper 关键字。不能直接访问所属类的实例变量和实例方法。

常量

finalJava 的一个保留关键字,可以声明成员变量、方法、类以及局部变量。被声明 final 的变量,一旦赋值便不能再次修改。编译器会检查代码,如果你尝试将变量初始化,编译器会报编译错误。final 变量经常和 static 关键字一起使用作为常量。

final 关键字要点:

  1. 方法前加 final 关键字,代表这个方法不可用被子类的方法重写
  2. 类名前加 final 关键字,代表这个方法不可用被继承
  3. final 关键字可以用于成员变量、局部变量、方法以及类
  4. final 成员变量必须在声明的时候初始化或者在构造器中初始化,否则会报编译错误
  5. 不可对 final 变量再次赋值
  6. final 局部变量必须在声明时赋值
  7. 在匿名类中所有变量都必须是 final 变量
  8. 接口中声明的所有变量本身是 final
  9. finalabstract 这两个关键字是反相关的,final 类就不可能是 abstract
  10. final 方法在编译阶段绑定,称为静态绑定(static binding
  11. 没有在声明时初始化 final 变量称为空白 final 变量(blank final variable),必须在构造器中初始化,或者调用 this() 初始化。否则编译器会报错
  12. 将类、方法、变量声明为 final 能提高性能,这样 JVM 就有机会进行估计,然后优化
  13. 按照 Java 代码习惯,final 变量就是常量,常量名大写
  14. 对于集合对象声明为 final 指引用不能被更改,但是可以向其中增加、删除或者改变内容

final 关键字解析

浅析Java中的final关键字