Java中关于final关键字的一些补充

对于类方法 ,静态初始化块、声明二选一指定初始值
对于实例变量 ,静态初始化块、声明、构造器三选一指定初始值

Java设计的一个缺陷: ,final成员变量未赋值时,不能通过syso直接访问,但却可以通过print方法间接的打印final修饰的成员变量,输出为0;

对于用fina修饰引用变量 ,仅仅限制的是对该变量的地址值,只要地址值不变,变量的属性值是可以改变的,即final修饰的引用类型变量不能够给他重新赋值,但可以改变引用类型变量所引用对象的内容。

宏变量 ,final修饰的变量其实本质上是一种宏变量,当定义了final变量以后,编译器会把程序中所有用到该变量的地方直接替换成该变量的值

关于宏变量

String s1 = "ab";
String s2 = "a" + "b";
syso(s1 == s2 )//true

String s3 = "a" ;
Stirng s4 = "b" ;
String s5 = s3 + s4 ;
system.out.println(s1 == s5) //false ;

对于s2 ,在编译时就可以确定下来,因此s2直接引用常量池中已有的字符串

对于s5 ,在编译只是将两个普通变量拼接,编译不会执行宏替换,所以无法编译期就确定s5的值,不能直接指向字符串池中缓存的字符串。

如果给s3s4加上final修饰,那么会默认的使用宏替换,这样在编译期就能够确定s5的值,也就是直接指向字符串池中缓存的字符串。(final修饰的实例变量,只有定义时指定了初始值才会有宏效果)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章