Java面试总结之final

static final是面试的时候经常被问到的问题

被final修饰的变量可以改变吗?

被final修饰的对象的内容可变,但是变量指向的地址不能变

那么被final修饰的int可以改变其值吗?

emmm,还是看图吧

Java面试总结之final_第1张图片

可以看到,因为是基本数据类型,使用了常量池技术,你要改变i的值就等于改变i的引用,那么它指向的内存地址也会改变,所以是没有办法通过的,那我们再来看看改变对象的内容,这里我们以StringBuffer为例:

Java面试总结之final_第2张图片 Final StringBuffer

可以看到StringBuffer的内容是可修改的,原因很简单,StringBuffer中有多个属性,文本内容只是其中一个,所以文本内容的改变并不会改变StringBuffer对象的地址,只会改变它里面内容对应的地址的引用,就好比如你换了个肾,但是你还是你。

但是如果使用的是String情况就不一样了,原因也很简单,我们来看一看String的源码:

Java面试总结之final_第3张图片 String源码

可以看到字符数组被final修饰了,也就是你想改变String存储的内容就必须重新new一个String,再让指针重新指向新的内存地址。

你可能感兴趣的:(Java)