java基础语法之final关键字
1、final关键字的含义。
Java关键字final有“无法改变的”、“最终的”等含义。可以修饰类,方法和成员变量。
final修饰的类不能被继承。(网上部分文章有结论:final类中的方法默认是final的。我不知道是怎么得出来的,但是感觉不对,写了个方法测试了下,证明结论是错误的。)
import java.lang.reflect.Method;import java.lang.reflect.Modifier;public final class FinalDemo{ public void normalMethod(){} public final void finalMethod(){} public static void main(String[] args) { try { Method normalMethod = FinalDemo.class.getMethod("normalMethod", null); Method finalMethod = FinalDemo.class.getMethod("finalMethod", null); System.out.PRintln(Modifier.toString(normalMethod.getModifiers())); System.out.println(Modifier.toString(finalMethod.getModifiers())); } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } }}输出结果:
publicpublic finalfinal方法不能被子类的方法覆盖。(网上有结论说final方法不能被子类方法覆盖,但是可以被继承,可以被继承应该是和final无关的,而是和方法的访问修饰符有关,例如public、private、protected,试想private final的那是肯定无法继承到子类的。)
final成员变量表示常量,只能被赋值一次。(网上很多说法是赋值后值不再改变,其实这种说法不准确,被final修饰的值,如果是基本类型,那么值不可变,如果是对象,则是引用不可变,对象的内容是可以改变的。)
public class TestDemo{ public static void main(String[] args) { final StringBuilder sb = new StringBuilder("hello"); sb.append(" world"); System.out.println(sb.toString()); }}还有一种说法:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。我就搞不懂了,final确实是禁止覆盖的意思,但是不能覆盖就一定是final在起作用?,明显是private方法不能被继承到子类,都没有继承到子类也就谈不上覆盖这种说法了。直接上例子:public class FinalDemo{ private void normalMethod(){} private final void finalMethod(){} public static void main(String[] args) { try { Method normalMethod = FinalDemo.class.getDeclaredMethod("normalMethod", null); Method finalMethod = FinalDemo.class.getDeclaredMethod("finalMethod", null); System.out.println(Modifier.toString(normalMethod.getModifiers())); System.out.println(Modifier.toString(finalMethod.getModifiers())); } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } }}输出结果:privateprivate final对final关键字含义的总结:final修饰的类不能被继承。
final修饰的方法不能被覆盖。
final成员变量表示常量,只能被赋值一次。被final修饰的值,如果是基本类型,那么值不可变,如果是对象则是引用不可变,对象的内容是可以改变的。
网上很多总结都是错误的,是“一家之言”,希望大家学习的时候本着技术的质疑和追根究底精神,而不是一味的盲从,把错误当成常识。
final的其他特性:
final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
final本地变量必须在声明时赋值。
2、final应用场景
String以及Integer、Long等基本数据类型封装类都是final class;
Math中PI 和 E 都是用final修饰的字段;
Math中sin cos等函数也是用final修饰的;
新闻热点
疑难解答