final關鍵字
- final基本介紹
- final的使用細節
final基本介紹
- final是最終的意思,可以修飾類,屬性,方法,局部變量
- 什么時候會要使用到final呢?
1.想要類不被繼承時
2.不希望類的某個屬性的值被改變時
3.不想父類的某個方法被子類重寫時
4.不想某個局部變量被修改時
代碼演示:
public class Final01 {public static void main(String[] args) {E e = new E();//e.TAX_RATE = 0.9;TAX_RATE 被final修飾,值不能改變}
}
final class A{//1.不希望被繼承的時候用final修飾,這樣B就不能繼承A了}
//class B extends A{ }A被final修飾,不能被繼承class C{public final void tao(){//3.不想被子類重寫此方法,用final修飾此方法//加了final的NUM也可以被叫做局部常量,不能修改final double NUM = 0.9;//4.如果不想局部變量被修改,用final修飾//NUM = 1.00;NUM被final修飾,值不能被改變}
}
class D extends C {
// @Override
// public void tao() {//重寫C的方法
// super.tao();
// }
// tao()被final修飾,不能被子類重寫
}class E{public final double TAX_RATE = 0.8;//2.不希望類的某個屬性被修改,用final修飾
}
final的使用細節
- final修飾的屬性也可以叫常量,一般用XX_XX來命名
- final修飾的屬性在被定義時必須要初始化并且不能修改,初始化可以寫在三個位置:
1.定義屬性時
2.在構造器中初始化
3.在代碼塊中初始化 - 如果final修飾的屬性是靜態的,那么只有兩個位置可以初始化
1.定義屬性時
2.在代碼塊中初始化
(不能在構造器中初始化,因為靜態屬性在類加載的時候就要被初始化,而構造器在實例化對象時才會被調用) - final類不能被繼承,但是可以實例化對象
- 一個非final類含有final修飾的方法,這個方法雖然不能被子類重寫,但是可以被子類繼承并使用
代碼演示:
public class FinalDetail01 {public static void main(String[] args) {CC cc = new CC();//Final類雖然不能被繼承,但是可以實例化對象new EE().show();//父類沒有被Final修飾,但是父類方法被Final修飾,// 雖然該方法不能被子類重寫,但是可以被子類繼承System.out.println(GG.n1);}
}
//final屬性在定義時就必須賦值,并且之后不能在修改
//1.可以在定義屬性時賦值
//2.可以在構造器中賦值
//3.可以在代碼塊中賦值
class AA{public final double TAX = 0.05;//定義屬性時賦值public final double TAX2;public final double TAX3;public AA() {TAX2 = 0.09;}//構造器中賦值{TAX3 = 0.4;}//代碼塊中賦值
}//如果Final修飾的屬性是靜態的,那么初始化的位置只能有:
//1.定義時賦值
//2.靜態代碼塊中
class BB{public static final double TAX4 = 0.6;public static final double TAX5;public BB() {//TAX5 = 0.7;賦值失敗//因為是在加載靜態屬性,并不是在加載實例屬性,所以不能在構造器中賦值//靜態屬性在類加載的時候就要被初始化,而構造器在實例化對象時才會被調用}static{TAX5 = 0.8;}//靜態代碼塊中賦值成功
}final class CC{ }class DD{public final void show() {System.out.println("show()");}
}
class EE extends DD{ }final class FF{public final void hi(){}//其實這個類已經是Final類了,這個方法就沒有必要被修飾成Final方法了//因為這個方法不能被繼承,所以不能被重寫
}class GG{String s1 = "hello";//String是Final類,不能被繼承public static final int n1 = 10;//當static和Final搭配使用時,調用這個屬性,不會導致類被加載,所以下面靜態代碼塊中的語句不會被執行static{System.out.println("靜態代碼塊被調用...");}}