谈到 final 关键字,想必很多人都不生疏,在应用匿名外部类的时候可能会常常用到 final 关键字。
另外,Java 中的 String 类就是一个 final 类。
一、final 关键字的根本用法
在 Java 中,final 关键字能够用来润饰类、办法和变量(包含成员变量和局部变量)。上面就从这三个方面来理解一下 final 关键字的根本用法。
1、润饰类
当用 final 润饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就能够用 final 进行润饰。final 类中的成员变量能够依据须要设为 final,然而要留神 final 类中的所有成员办法都会被隐式地指定为 final 办法。
在应用 final 润饰类的时候,要留神审慎抉择,除非这个类真的在当前不会用来继承或者出于平安的思考,尽量不要将类设计为 final 类。
2、润饰办法
“应用 final 办法的起因有两个。第一个起因是把办法锁定,以防任何继承类批改它的含意;第二个起因是效率。在晚期的 Java 实现版本中,会将 final 办法转为内嵌调用。然而如果办法过于宏大,可能看不到内嵌调用带来的任何性能晋升。在最近的 Java 版本中,不须要应用 final 办法进行这些优化了。“
因而,如果只有在想明确禁止 该办法在子类中被笼罩的状况下才将办法设置为 final 的。即父类的 final 办法是不能被子类所笼罩的,也就是说子类是不可能存在和父类截然不同的办法的。
final 润饰的办法示意此办法曾经是“最初的、最终的”含意,亦即此办法不能被重写(能够重载多个 final 润饰的办法)。此处须要留神的一点是:因为重写的前提是子类能够从父类中继承此办法,如果父类中 final 润饰的办法同时访问控制权限为 private,将会导致子类中不能间接继承到此办法,因而,此时能够在子类中定义雷同的办法名和参数,此时不再产生重写与 final 的矛盾,而是在子类中从新定义了新的办法。(注:类的 private 办法会隐式地被指定为 final 办法。)
3、润饰变量
润饰变量是 final 用得最多的中央,也是本文接下来要重点论述的内容。
final 成员变量示意常量,只能被赋值一次,赋值后值不再扭转。
当 final 润饰一个根本数据类型时,示意该根本数据类型的值一旦在初始化后便不能发生变化;如果 final 润饰一个援用类型时,则在对其初始化之后便不能再让其指向其余对象了,但该援用所指向的对象的内容是能够发生变化的。实质上是一回事,因为援用的值是一个地址,final 要求值,即地址的值不发生变化。
final 润饰一个成员变量(属性),必须要显示初始化。这里有两种初始化形式,一种是在变量申明的时候初始化;第二种办法是在申明变量的时候不赋初值,然而要在这个变量所在的类的所有的构造函数中对这个变量赋初值。
当函数的参数类型申明为 final 时,阐明该参数是只读型的。即你能够读取应用该参数,然而无奈扭转该参数的值。
二、深刻了解 final 关键字
在理解了 final 关键字的根本用法之后,这一节咱们来看一下 final 关键字容易混同的中央。
1、类的 final 变量和一般变量有什么区别?
当用 final 作用于类的成员变量时,成员变量(留神是类的成员变量,局部变量只须要保障在应用之前被初始化赋值即可)必须在定义时或者结构器中进行初始化赋值,而且 final 变量一旦被初始化赋值之后,就不能再被赋值了。
2、被 final 润饰的援用变量指向的对象内容可变吗?
援用变量被 final 润饰之后,尽管不能再指向其余对象,然而它指向的对象的内容是可变的
3、final 参数的问题
在理论利用中,咱们除了能够用 final 润饰成员变量、成员办法、类,还能够润饰参数、若某个参数被 final 润饰了,则代表了该参数是不可扭转的。如果在办法中咱们批改了该参数,则编译器会提醒你:The final local variable i cannot be assigned. It must be blank and not using a compound assignment。
java 采纳的是值传递,对于援用变量,传递的是援用的值,也就是说让实参和形参同时指向了同一个对象,因而让形参从新指向另一个对象对实参并没有任何影响。
最初
我整顿了一份 Java 零碎学习材料,如有须要请扫描下方二维码支付!