c++和 java : final

編程語言關鍵字

C++11標準提供了說明符final。須要注意的是,C++11中的final不是關鍵字,而是說明符,這意味着您能夠將它(在不引發混淆的狀況下)將它做爲標識符使用(爲了兼容之前的代碼)。相似的說明符還有override。Java和AS3.0關鍵字final有「這是沒法改變的」或者「終態的」含義,它能夠修飾非抽象類、非抽象類成員方法和變量。你可能出於兩種理解而須要阻止改變:設計或效率。ios

C++中的

C++11標準提供了說明符final,用於阻止派生類覆蓋特定的虛方法。或是阻止一個類成爲基類編程

語法1:class Someclass final {...};編程語言

語法2:class Someclass {...type somefun(arg-listfinal;...};ide

舉例以下:函數

#include <iostream>
class X
{
  private:
          char c;
  public:
         X():c('B'){}
         X(char arg):c(arg){}
         virtual void put()const final{std::cout<<c<<std::endl;}
         //final修飾了put()函數,使其不能被覆蓋
   //...  
};

class Y:public X
{
  private:
          int i;
  public:
         Y():i(0){}
         Y(int arg):i(arg){}
         //這裏不能有void put();了,由於有了final說明符
   //...  
};

class Z final //final修飾Z類,您不能從Z類派生出一個類,而只能用於建立對象
{
  private:
          double d;
  public:
         Z():d(0.0){}
         Z(double arg):d(arg){}
         void put()const{std::cout<<d<<std::endl;}
  //...
};

int main()
{
    using namespace std;
    char final='X';//能夠這麼作
    X x(final);
    x.put();//輸出 X
    Y y;
    y.put();//輸出 B
    Z z(3.14159);
    z.put();//輸出3.14159
    return 0;
}

Java中的

一、final類spa

final類不能被繼承,所以final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,若是這個類不須要有子類,類的實現細節不容許改變,而且確信這個類不會再被擴展,那麼就設計爲final類。 final方法不能被子類的方法覆蓋,但能夠被繼承。設計

二、final方法code

若是一個類不容許其子類覆蓋某個方法,則能夠把這個方法聲明爲final方法。對象

使用final方法的緣由有二:繼承

第1、把方法鎖定,防止任何繼承類修改它的意義和實現。

第2、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提升執行效率。

三、final變量(常量)

用final修飾的成員變量表示常量,只能被賦值一次,賦值後值沒法改變!

final修飾的變量有三種:靜態變量、實例變量和局部變量,分別表示三種類型的常量。

從下面的例子中能夠看出,一旦給final變量初值後,值就不能再改變了。

另外,final變量定義的時候,能夠先聲明,而不給初值,這種變量也稱爲final空白,不管什麼狀況,編譯器都確保空白final在使用以前必須被初始化。可是,final空白在final關鍵字final的使用上提供了更大的靈活性,爲此,一個類中的final數據成員就能夠實現依對象而有所不一樣,卻有保持其恆定不變的特徵。

四、final參數

當函數參數爲final類型時,你能夠讀取使用該參數,可是沒法改變該參數的值。

注:父類的private成員方法是不能被子類方法覆蓋的,所以private類型的方法默認是final類型的。

final不能用於修飾構造方法。

示例:

public void f1(final int i){ } //i是final類型的,值不容許改變的.

相關文章
相關標籤/搜索