1.1 final的概念 final是個修飾符,它可以用來修飾類,類的成員,以及局部變數。不能修飾構造方法。 問題: 繼承的出現提高了代碼的復用性,並方便開發。但隨之也有問題,有些類在描述完之後,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫。可是當子類繼承了這些特殊類之後,就可以對 ...
1.1 final的概念
final是個修飾符,它可以用來修飾類,類的成員,以及局部變數。不能修飾構造方法。
問題:
繼承的出現提高了代碼的復用性,並方便開發。但隨之也有問題,有些類在描述完之後,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫。可是當子類繼承了這些特殊類之後,就可以對其中的方法進行重寫,那怎麼解決呢?
答:
需要使用到一個關鍵字final,final的意思為最終,不可變。
1.2 final的特點
1. final修飾類不可以被繼承,但是可以繼承其他類。
例如:
public class Fu{} public final class TaiJian extends Fu{//可以繼承父類 } public class Zi extends TaiJian{//不可以被其他類繼承 }
2.final修飾的方法不可以被子類重寫,但父類中沒有被final修飾方法,子類重寫後可以加final。
例如:
class Fu { // final修飾的方法,不可以被覆蓋,但可以繼承使用 public final void method1(){} public void method2(){} } class Zi extends Fu { //重寫method2方法 public final void method2(){} }
3.final修飾的變數稱為常量,這些變數只能賦值一次。而且終身不變。
例如:
final int i = 20;
i = 30; //賦值報錯,final修飾的變數只能賦值一次
4. 引用類型的變數值為對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改。
final Person p = new Person(); Person p2 = new Person(); p = p2; //final修飾的變數p,所記錄的地址值不能改變 p.name = "小明";//可以更改p對象中name屬性值 p不能為別的對象,而p對象中的name或age屬性值可更改。
5. 修飾成員變數,需要在創建對象前賦值,否則報錯。(當沒有顯式賦值時,多個構造方法的均需要為其賦值。)
//賦值方法1. final int i = 20; //賦值方法2. public class Fu { final String name; public Fu(String name){ this.name=name; } } //賦值方法3. class Demo { //final修飾的成員變數,需要在創建對象前賦值,否則報錯。 final int n; public Demo(){ //可以在創建對象時所調用的構造方法中,為變數n賦值 n = 2016; } }