首页 > 代码库 > 哎,又是一个final引发的问题
哎,又是一个final引发的问题
啥都不说了,今天我就是和final关键字给杠上了,看题:
public class Test { final int age; public Test(){ age=10; } public static void main(String[ ] args) { System.out.println(new Test().age); } }
执行结果如下所示:
思路分析:
今天忙活了一天有点累了,我也不扯那么多了,直接进入正题。我又做了个图,哈哈,不要打我,图这个东西可以声情并茂的解决问题,哦,不对,比喻错了,但是也可以解决问题!来看看执行顺序吧!这样就明白了。
前面不是说被final修饰过的不能发生改变吗?这句话一点也不错,确实没有发生改变,根据执行顺序我们可以看到,age属性的初始值就是10,因此执行结果是10很正常的。当代码改为如下时就能到达你心目中不能改变的要求啦!
public class Test { final int age; public Test(){ age=10; } public void say(){ age = 20; //执行错误,不能再次赋值 } public static void main(String[ ] args) { System.out.println(new Test().age); } }
当我们添加say()方法为age属性重新赋值时,程序就会出错。因此不能发生改变的情况是发生在初始化之后的。
public class Test { final int age = 8; public Test(){ age=10; } public static void main(String[ ] args) { System.out.println(new Test().age); } }
但是如上述情况中,age是直接就被初始化赋值了,因此在构造器中便不能再次赋值了。
哎,又是一个final引发的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。