final是一个可以对类、方法、变量修饰的修饰词。它最直接的意思就是,被它修饰的元素,不可以再被改变了,已经是最终形态了
1.当它用于修饰类的时候
表示这个类不可以被继承了。这个类不可以有子类,已经是最终形态了。
final类内部的所有的方法都隐式的被final修饰(反正已经不可能被重写了)
内部的变量的话,按情况自己定吧。
2.修饰方法的时候
这个方法不可以被重写(也就是被子类覆盖,如果是private修饰的方法是被隐式指定为final的,因为,字类获取不到private方法,但是private变量可没有被隐式的final啊,分清。)
对于private方法,这里提一下哈,子类是获取不到父类的任何用private关键字修饰的元素的。也就是说,你在子类中定义相同名字的方法和属性,都和父类的那个无关。也不存在重写的情况,那是你自己定义的,之前压根儿就没有。
3.修饰变量
表示这个变量是一个常量,只能被赋值一次。一次之后就不能更改了。
被final休斯的成员变量可以在声明的时候直接初始化,也可以在所有的构造函数里初始化,。但是其它情况不行,而且,你必须在这两种里面选择一个,不能不选。(final修饰的成员变量必须显式初始化,就是解释这句话嘞)
final修饰参数,和修饰变量一样。
但是不能再给它赋值了,因为在函数调用的时候已经赋值过了。
划重点啦:
final string str = "kkk"
string strs = str+"hhh"
print(strs == str)
伪代码啊,答案是true,因为。string strs = str + "hhh"等同于strs = "kkk" + "hhh",
因为编译器优化了。而且有一点记住,如果在编译时期并不知道strs的真实值,上面的优化就不成立了,str会被认为一个引用类型
其实上面的strs = “kkk”+"hhh"它还等通过strs = “kkkhhh”因为JVM在字符串之间使用+号的时候会优化。如果具有引用类型则不会这样优化了,掠过掠过,在之后的String讨论的时候再讨论这个问题。
而我们上面说到的编译时期就知道的值是指的 final string str ="sss"
final string str = getHellp()这种是运行时赋值
这样我们可以得出一个结论,并不是所有的final修饰的变量都在编译时被赋值的。也可以通过方法的形式来运行时赋值。
但是谨记一点,只能被赋值一次。
被final修饰的值类型不可变,但是被final修饰的引用类型(也不可变)所指向的对象的状态可变。
相信看过上篇值类型及引用类型的小伙伴能自己探索其中奥秘了。