final:adj. 最終的,不可改變的
我們就取其字面意思”不可改變的“。
final可以修飾類、方法、變量。那么分別是什么作用呢?
(1)修飾類:表示類不可被繼承
(2)修飾方法:表示方法不可被覆蓋
(3)修飾變量:表示變量一旦被賦值就不可以更改它的值。java中規定final修飾成員變量必須由程序員顯示指定變量的值。
final修飾成員變量時,要在哪里執行初始值?
(1)如果final修飾的是類變量,只能在靜態初始化塊中指定初始值或者聲明該類變量時指定初始值。
(2)如果final修飾的是成員變量,可以在非靜態初始化塊、聲明該變量或者構造器中執行初始值。
注意,只能在一個地方指定初始值!!
final修飾局部變量
系統不會為局部變量進行初始化,局部變量必須由程序員顯示初始化。因此使用final修飾局部變量時,即可以在定義時指定默認值(后面的代碼不能對變量再賦值),也可以不指定默認值,而在后面的代碼中對final變量賦初值(僅一次)。
final修飾基本類型變量和引用類型變量的區別?
final修飾基本類型變量時,不能對基本類型重新賦值。
但是,對於引用型變量,它僅僅保存的是一個引用,final保證的是這個引用類型的變量所引用的地址不會變。即一直引用同一個對象,但是這個對象的值可以改變。
class Person() { private int age; public Person(){} public Person(int age) { this.age = age; } } public class FinalReferenceTest { main() { final int[] iArr={1,2,3,4}; Arrays.sort(iArr);//合法 iArr[2]=-3;//合法 iArr=null;//非法,對iArr不能重新賦值 final Person p = new Person(25); p.setAge(24);//合法 p=null;//非法 } }
final修飾方法
final修飾的方法不能被重寫。例如Object類中的getClass()方法就是final方法。不能被重寫。
父類中private的方法,在子類中不能訪問該方法,但是子類中仍然可以定義一個與父類private方法有相同的方法名、相同的形參列表和相同的返回值的方法,不屬於方法重寫,只是定義了一個新的方法。
final修飾的方法僅僅是不能被重寫,並不是不能被重載。下面的代碼,是方法重載,仍然沒有錯誤!
public class FinalClass { public final void test(){} public final void test(int i){} }
final修飾類
final修飾的類不能被繼承!