1.final修饰类的类不能被继承,所以final和abstract不能同时使用
2.final修饰的方法不能被重写,但可以被重载
3.final修饰的变量是不可变的,如果是基本数据类型(int double等等),则其值是不能改变的;如果是引用变量(除基本数据类型之外的),一直指向一开始的变量内容,但变量内容是可以改变的
public class Main {
public static void main(String[] args) {
String a = "xiaomeng2";
final String b = "xiaomeng";
String d = "xiaomeng";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
}
这段代码的输出结果是什么呢?
答案是: true 和 false
原因:变量a指的是字符串常量池中的 xiaomeng2;
1.变量 b 是 final 修饰的,变量 b 的值在编译时候就已经确定了它的确定值,换句话说就是提前知道了变量 b 的内容到底是个啥,相当于一个编译期常量;
2.变量 c 是 b + 2得到的,由于 b 是一个常量,所以在使用 b 的时候直接相当于使用 b 的原始值(xiaomeng)来进行计算,所以 c 生成的也是一个常量,a 是常量,c 也是常量,都是 xiaomeng2 而 Java 中常量池中只生成唯一的一个 xiaomeng2 字符串,所以 a 和 c 是相等的!
3.d 是指向常量池中 xiaomeng,但由于 d 不是 final 修饰,也就是说在使用 d 的时候不会提前知道 d 的值是什么,所以在计算 e 的时候就不一样了,e的话由于使用的是 d 的引用计算,变量d的访问却需要在运行时通过链接来进行,所以这种计算会在堆上生成 xiaomeng2 ,所以最终 e 指向的是堆上的 xiaomeng2 , 所以 a 和 e 不相等。
4.总得来说就是:a、c是常量池的xiaomeng2,e是堆上的xiaomeng2
可以看到用final修饰的基本数据类型不可发生改变,会报错
对于引用类型也是如此
但是引用类型的内容是可以发生改变的
关于堆栈以及常量池的更新在下一篇文章!!!