談到final關(guān)鍵字易猫,想必很多人都不陌生,在使用匿名內(nèi)部類的時候可能會經(jīng)常用到final關(guān)鍵字。另外凿歼,Java中的String類就是一個final類,那么今天我們就來了解final這個關(guān)鍵字的用法。
- 在Java中答憔,final關(guān)鍵字可以用來修飾類味赃、方法和變量(包括成員變量和局部變量)。下面就從這三個方面來了解一下final關(guān)鍵字的基本用法虐拓。
- 修飾類
-
當(dāng)用final修飾一個類時心俗,表明這個類不能被繼承。final類中的成員變量可以根據(jù)需要設(shè)為final蓉驹,但是要注意final類中的所有成員方法都會被隱式地指定為final方法城榛。
示例代碼
-
- 修飾方法
- 摘自《Java編程思想》第四版第143頁:
"使用final方法的原因有兩個。第一個原因是把方法鎖定态兴,以防任何繼承類修改它的含義狠持;第二個原因是效率。在早期的Java實現(xiàn)版本中瞻润,會將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用喘垂。但是如果方法過于龐大,可能看不到內(nèi)嵌調(diào)用帶來的任何性能提升绍撞。在最近的Java版本中王污,不需要使用final方法進(jìn)行這些優(yōu)化了。"
因此楚午,如果想明確禁止指定方法在子類中不被重寫昭齐,就將該方法設(shè)置為final(類的private方法會隱式地被指定為final方法)
- 修飾變量:對于修飾為final的變量,它就不能再賦值矾柜。
-
如果是基本數(shù)據(jù)類型的變量阱驾,則其數(shù)值一旦在初始化之后便不能更改;
示例代碼
上面的一段代碼中怪蔑,對變量i和obj的重新賦值都報錯了里覆。
- 如果是引用類型的變量,則在對其初始化之后便不能在賦值缆瓣,但該對象行為不被final影響喧枷,也就是對象里面
-
public class Year {
private int year;
private String name;
public Year(int year, String name) {
this.year = year;
this.name = name;
}
public void setYear(int year) {
this.year = year;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Year{" +
"year=" + year +
", name='" + name + '\'' +
'}';
}
public static void main(String[] args) {
final Year year=new Year(1,"2");
System.out.println(year.toString());
year.setYear(3);
System.out.println(year.toString());
}
}
輸出
Year{year=1, name='2'}
Year{year=3, name='2'}