java编程思想--final关键字
討論final使用的三種情況:數據,方法和類
final數據
1,一個永不改變的編譯時常量
2,一個在運行時被初始化的值,而你不希望它被改變
例
import java.util.*;class Value{int i;public Value(int i){this.i=i;} } public class FinalData {private static Random rand =new Random(47);private String id;public FinalData (String id){this.id=id;}private final int valueOne=9;private static final int VALUE_TWO=99;public static final int VALUE_THREE=39;private final int i4=rand.nextInt(20);static final int INT_5=rand.nextInt(20);private Value v1=new Value(1);private final Value v2=new Value(22);private static final Value VAL_3=new Value(33);private final int[] a={1,2,3,4,5,6};public String toString(){return id+": "+"i4="+i4+",INT_5:"+INT_5;}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubFinalData fd1=new FinalData("fd1");fd1.v2.i++;fd1.v1=new Value(9);for(int i=0;i<fd1.a.length;i++)fd1.a[i]++;System.out.println(fd1);System.out.println("Create new FinalData");FinalData fd2=new FinalData("fd2");System.out.println(fd1);System.out.println(fd2);}}結果
fd1: i4=15,INT_518
Create new FinalData
fd1: i4=15,INT_518
fd2: i4=13,INT_518
解析:
i4僅僅是final類型,分別在兩個對象中各開辟一塊空間
static final 僅使用一段不能改變的空間,所以INT_5值不變
空白final
指被聲明為final但又未給定初始值的域,編譯器保證空白final使用前必須被初始化
final類型參數
無法在方法中更改參數引用所指向的對象
final方法
類中所有private方法都隱式地制定為是final的,一個類繼承基類的private方法(final),可以覆蓋private final方法。但如果在導出類中以相同的名稱生成一個public,protected或包訪問權限方法的話,此時并沒有覆蓋該方法,僅是生成了一個新的方法。
將方法聲明為final那有兩個原因,第一就是說明你已經知道這個方法提供的功能已經滿足你要求,不需要進行擴展,并且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。第二就是允許編譯器將所有對此方法的調用轉化為inline調用的機制,它會使你在調用final方法時,直接將方法主體插入到調用處,而不是進行例行的方法調用,例如保存斷點,壓棧等,這樣可能會使你的程序效率有所提高,然而當你的方法主體非常龐大時,或你在多處調用此方法,那么你的調用主體代碼便會迅速膨脹,可能反而會影響效率,所以你要慎用final進行方法定義。例
import javax.swing.text.GapContent;import org.omg.CORBA.PRIVATE_MEMBER;class WithFinals{private final void f(){System.out.println("WithFinals.f()");}private void g(){System.out.println("WithFinals.g()");} } class OverridingPrivate extends WithFinals{private final void f(){System.out.println("OverridingPrivate.f()");}private void g(){System.out.println("OverridingPrivate.g()");} } class OverridingPrivate2 extends OverridingPrivate{public final void f(){System.out.println("OverridingPrivate2.f()");}public void g(){System.out.println("OverridingPrivate2.g()");} } public class FinalOverridingIilusion {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubOverridingPrivate2 op2=new OverridingPrivate2();op2.f();op2.g();}}結果
OverridingPrivate2.f()
OverridingPrivate2.g()
如果將 WithFinals的g()方法前private改為final,則后面的覆蓋就會報錯,因為單單的final方法不允許覆蓋,可以直接調用
final類
當某個類整體定義為final,表明了不能繼承該類。該類的設計永不需要做任何改動 ,或出于安全考慮,不希望它有子類
final類的域可以選擇是什么類型,是或不是fianl,默認指定final,無法覆蓋它們
總結
以上是生活随笔為你收集整理的java编程思想--final关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【1】PASCAL VOC数据集下载
- 下一篇: TextMeshPro备用字体疑问