java中的final修饰符与常量池

    大家在学习编程语言的时候,都接触过变量和常量。变量就是可以变化的量,值是可变的。常量就是只要赋值了,就不允许再次赋值。
    那很多人就有疑问了,我在程序没有运行之前不是可以改变这个常量的值吗?怎么说是不可变的?常量不可变又是怎么个不可变的?假设它就是不可变的那又保存在什么地方呢?还有就是那些值是不可变的呢?

    下面我们就针对这些问题来介绍一下。(以下介绍皆是基于jdk1.7及以下的版本,因为jdk1.8及以上内存布局有所变化)

常量池

    常量池 分为两部分:静态常量池运行时常量池 ;你可以理解为静态常量池是运行时常量池的一部分,静态常量池是运行时常量池的子集;保存在方法区中。

    静态常量池.class文件的类信息,字面量(字符串、整形值、final修饰的常量)和方法信息都将保存在静态常量池中,然后程序运行加载,就会将这部分信息放入运行常量池中的静态常量池中。

所以说一般在编程语言中很多字面量在编译的时候就已经被认定是常量保存进静态常量池了。

    运行时常量池我常说的常量池其实就是泛指这个运行时常量池,静态常量池就是运行时常量池的组成部分。程序在运行期间还会动态产生一些新的常量,也会放入这个池中。

比如说以下的例子:

public class Test{
     
	public static void main(String[] args){
     
		for(int a=0;a<100;a++){
     
			String str=new String(a+" ");
		}
	}
}

上述代码片段就在常量池中,动态添加了100个常量。


final修饰符

    在java中final修饰符可以修饰 类,方法和变量
final修饰的修饰的类不可被继承,final修饰的方法不允许被重写但是可以按照重写的规则在子类中重写一个和父类一致的方法;final修饰的的成员变量是常量,一经赋值不允许二次赋值。

final修饰的变量也叫做常量,在编译的时候这个值就被确定了。

注意:如果final修饰的常量在声明的时候不赋初值,则必须在该类的构造器中显示的赋值,否则编译报错。

你可能感兴趣的:(java)