Java 常量和静态变量
摘录于 Java静态变量与常量- 知乎
static 修饰的成员变量或者成员方法习惯上称之为静态变量或静态方法,可以直接通过类名来访问,只要这个类被加载,JVM 就可以根据类名在运行时数据区的方法区找到他们。因此 static 修饰的变量和方法,可以在它所属的对象创建之前访问,不用创建对象。
静态变量
访问语法为:
类名.静态方法名(参数列表) 类名.静态变量名
按照是否静态的对类成员变量进行分类可分为两种:
- 被
static修饰的变量,叫静态变量或类变量 - 没有被
static修饰的变量,叫实例变量
静态变量与实例变量的区别:
- 静态变量在内存中只有一个拷贝(节省内存), JVM只为静态分配一次内存。在加载类的过程中完成静态变量的内存分配。 可用类名直接访问,当然也可以通过对象来访问(不推荐)。
- 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响,需要通过实例的引用来访问。
- 在定义静态变量时,通常将所有的字母大写,与实例变量做区分
静态变量应用场景:
- 对象之间共享值
- 方便访问变量
静态方法
静态方法可以直接通过类名调用,任何的实例也可以调用。因此静态方法只能访问所属类的静态变量和静态方法,不能用 this 和 super 关键字。不能直接访问所属类的实例变量和实例方法。
常量
final 是 Java 的一个保留关键字,可以声明成员变量、方法、类以及局部变量。被声明 final 的变量,一旦赋值便不能再次修改。编译器会检查代码,如果你尝试将变量初始化,编译器会报编译错误。final 变量经常和 static 关键字一起使用作为常量。
final 关键字要点:
- 方法前加
final关键字,代表这个方法不可用被子类的方法重写 - 类名前加
final关键字,代表这个方法不可用被继承 final关键字可以用于成员变量、局部变量、方法以及类final成员变量必须在声明的时候初始化或者在构造器中初始化,否则会报编译错误- 不可对
final变量再次赋值 final局部变量必须在声明时赋值- 在匿名类中所有变量都必须是
final变量 - 接口中声明的所有变量本身是
final的 final和abstract这两个关键字是反相关的,final类就不可能是abstract的final方法在编译阶段绑定,称为静态绑定(static binding)- 没有在声明时初始化
final变量称为空白final变量(blank final variable),必须在构造器中初始化,或者调用this()初始化。否则编译器会报错 - 将类、方法、变量声明为
final能提高性能,这样 JVM 就有机会进行估计,然后优化 - 按照 Java 代码习惯,
final变量就是常量,常量名大写 - 对于集合对象声明为
final指引用不能被更改,但是可以向其中增加、删除或者改变内容