java中final关键字在平时开发中用到的不多也不算少,大多均用在修饰类的变量上,很少用final去对一个类进行修饰,因为那意味着,该类将不能被继承。从设计角度出发我们更偏向于对类进行继承重用,以体现它的好处等。但final的作用远不止于此。
final代表的含义
final在java中代表着"最终"、"不可修改"之意,即一旦初始化(强调初始化时必须对final修饰的变量进行初始化值)完成就不可对其进行修改。
final用法1:修饰类
如果一个类被final进行修饰,那么该类将无法被继承。Java中的String类就是一个final修饰的类。此类的成员变量可以被final修饰也可以不使用final修饰。但该类的所有方法皆隐式被final修饰,被final修饰的方法,在不能被继承的基础上,自然不能被重写。实际开发中,一旦对类进行final修饰,意味着这个类将作为终类使用,不会被继承。
final用法2:修饰方法
final修饰方法用于表明该方法不可以被子类继承进行重写修改。(早期java中,final修饰的方法会被作为内嵌调用以提升性能,但方法如果过于庞大将失去意义,在后期java中被砍掉此优化作用)
注意:这里修饰的方法指的是可以被子类进行继承的方法。若方法同时被private进行修饰,表明方法是该类私有的方法,不存在被继承的作用范围内,那final作用将失去。
可以看出,final和private同时修饰方法,final只是表明该方法不能被子类重写(前提是在该方法能够被重写的基础上),private修饰方法表明该方法是私有的不可被继承,那么子类如果存在和父类方法名和参数、返回值一致的方法,属于子类自己所有而不是重写父类,所以即便该方法同时也被final修饰了(没有能够被重写的基础),子类亦可正常声明该方法。
final用法3:修饰变量
开发过程中用法最多的地方就属对于变量的修饰了,final修饰变量表示该变量是一次赋值,不可以被二次修改,当然前提是必须对final修饰变量进行初始化,初始化的方式可以是直接声明,也可以是在构造函数中进行初始化。这里需要加以区别的是”变量类型“。
基本数据类型:对于final修饰的基本数据类型,对其值不可被修改。
引用类型:变量所指的值即引用的内存物理地址,改地址无法进行改变,但不影响对引用的对象进行操作。
这里看出final修饰的变量,如果使用构造函数进行初始化的话,需要所有构造函数进行初始化,但不影响每个构造函数对其初始化的值不尽相同。
final修饰引用类型,不可对其进行指向新的引用,但可对其引用的对象进行值修改。
如果final修饰函数参数的话,同样进行理解,表明函数对其只读性。
注意:当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量(这里注意是常量对比非对象,有兴趣的可以了解下String相关知识),不需要在运行时确定。如果编译期无法确定该变量的确切值那就没办法进行常量替换了。看如下:
以上就是对final的理解和认识,如有不妥请留言斧正。