java final
一、final方法为何会高效
final方法会在编译的过程中利用内嵌机制进行inline优化。
inline优化是指:在编译的时候直接调用函数代码替换,而不是在运行时调用函数。 inline需要在编译的时候就知道最后要用哪个函数,显然,非final是不行的。
非final方法可能在子类中被重写,由于可能出现多态的情况,编译器在编译阶段 并不能确定将来调用方法的对象的真正类型,也就无法确定到底调用哪个方法。
对于编译期常量的这种情况,编译器可以将该常量值代入任何可能用到它的计算式中,也就是说,可以在编译期就执行计算式,这减轻了一些运行时的负担。在java中,这类常量必须是基本类型,并且以final表示。在对这个常量定义时,必须进行赋值。
二、final数据
许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的。有时数据的恒定不变是很有用的,例如:
1,一个编译时恒定不变的常量
2,一个在运行时初始化,而你不希望它被改变。
对于编译期常量的这种情况,编译器可以将该常量值代入任何可能用到它的计算式中,也就是说,可以在编译期就执行计算式,这减轻了一些运行时的负担。在java中,这类常量必须是基本类型,并且以final表示。在对这个常量定义时,必须进行赋值。
一个即是static又是final的域只占一段不能改变的存储空间。
当final应用于对象引用时,而不是基本类型时,其含义有些让人疑惑。对基本类型使用fianl不能改变的是他的数值。而对于对象引用,不能改变的是他的引用,而对象本身是可以修改的。一旦一个final引用被初始化指向一个对象,这个引用将不能在指向其他对象(该引用=new 对象())。java并未提供对任何对象恒定不变的支持。这一限制也通用适用于数组,它也是对象。
final int a=0; a=1; final Integer i1=new Integer(10); i1=new Integer(11); final String s1=new String("1"); s1=new String("2"); final Teacher t=new Teacher("oracle"); t=new Teacher("oracle");
上面全部不正确。
final Teacher t=new Teacher("oracle"); t.setName("mysql");
这句则对。