1.什麼時候可以選擇final修飾符
如果想讓一個類不被其他類繼承,不允許在有子類,這時候就要考慮用到final來修飾。
2.用final修飾的類
首先大家要明白,用final修飾的類是不能被繼承的,下面來看一個錯誤案例。
eg:
final class Penguin { } class SubPenguin extends Penguin { }
此時這段代碼的class SubPenguin extends Penguin這行代碼會報錯:
The type SubPenguin cannot subclass the final class :翻譯:該類型SubPenguin不能繼承的最後類
即.Penguin類不能被繼承。
3.用final修飾的方法
eg:
class Penguin { public final void print(){} } class Subpenguin extends Penguin { public void print(){}//錯誤 }
此時這段代碼public void print(){}會報錯,提示錯誤信息:
cannot override the final method from Penguin:翻譯:無法覆蓋企鵝的最後方法
即.print方法不能被子類重寫。
4.用final修飾的變量
用final修飾的變量包括成員變量和局部變量,他們將變成常量,只能賦值一次。
public class Dog { final String name="小黃";//用final來修飾狗狗的姓名 public void setname(String name) { this.name=name; //錯誤,name不能在被賦值。 } }
5.使用final修飾符的注意點
final可以用來修飾類,方法和屬性,不能修飾構造方法。
6.用final修飾的引用型變量,變量所指對象的屬性值是否能改變?
首先來看一個簡單的例子
//狗狗類 public class Dog { String name;//狗狗的姓名 //帶參構造,給狗狗的名字賦值 public Dog(String name) { this.name=name; } } //測試類 class Test { public static void main(String[] args) { final Dog dog=new Dog("小黃");//實例化一個狗對象,用final修飾 dog.name="大黃"; dog=new Dog("小八"); } }
這段代碼中dog對象被修飾為final成常量,其值不可變,但要注意的是dog.name="大黃";這行代碼並沒有錯,那麼dog=new Dog("小八")是錯的,也就是說,使用final修飾的引用型變量,變量不可以在指向另外的對象,但是所指變量的內容是可以改變的。
結論:使用final修飾的引用型變量時,變量的值時固定不變的,而變量所指對象的屬性值是可變的。