谈到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零碎学习材料,如有须要请扫描下方二维码支付!