[Java][Final]

1.final的作用

final的作用是使被修飾的目標無法改變。final可以修飾變量傀蚌,方法和類基显。

2.final修飾參數(shù)

Student對象

public class Student
{

    private int id;
    private String name;
    private int age;
    public int getId()
    {
        return id;
    }
    public void setId(int id)
    {
        this.id = id;
    }
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    
    @Override
    public String toString()
    {
        return "name:"+this.name+" age:"+this.age;
    }
}

測試例子

/**
 * @author LGY
 * @time 2017-11-9
 * @action 
 * Java編程思想第四版140頁是這么描述的,“對應基本類型善炫,final使數(shù)值恒定不變撩幽,對應對象引用,final使引用恒定不變箩艺。
 * 一旦引用被初始化指向一個對象窜醉,就無法再把他改為指向另一個對象。然而對象其自身卻是可以被修改的艺谆。
 * Java并未提供使任何對象恒定不變的途徑(但是可以自己編寫類以取得使對象恒定不變的效果)榨惰。這一限制同樣適用于數(shù)組,它也是對象”
 * 
 * 對應上面這句話静汤,我肯可以理解一旦final修飾了引用指向了一個對象琅催,那么這個引用就不能在指向其他對象了,但是這個對象的成員變量和成員方法卻是可以修改的虫给。
 * 如果想讓這個對象成員變量和成員方法都不能被修改藤抡,就需要使成員變量和成員方法被final修飾,這樣就能實現(xiàn)讓對象恒定不變的效果抹估。
 * 這里也提到了數(shù)組也是一個對象缠黍,所以數(shù)組也是這個情況。
 * 
 * student本身指向的對象在初始化之后不能修改,但是指向的這個對象的字段可以修改
 */
public class Test2 extends Activity
{
    private final int i = 5;
    private final Integer it = 5;
    private final String string = "hello";
    private final Student student = new Student();
    private final String[] array= {"aa","bb","cc"};
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        sendData(i, it);
        Log.i("lgy", "after i:"+i+" it:"+it);
        
        sendDataTestString(string);
        Log.i("lgy", "after String:"+string);
        
        student.setAge(18);
        student.setName("lgy");
        student.setId(1);
        sendDataTestObject(student);
        Log.i("lgy", "after student:"+student.toString());
        
        
        sendDataTestArray(array);
        Log.i("lgy",array[0]+array[1]+array[2]);
    }
    private void sendData(int i,Integer it)
    {
        i++;
        it++;
        Log.i("lgy", "i:"+i+" it:"+it);
    }
    
    private void sendDataTestString(String str)
    {
        str = str+" JAVA";
        Log.i("lgy", "String:"+str);
    }
    
    private void sendDataTestObject(Student student)
    {
        student.setAge(24);
        student.setName("LGY");
        Log.i("lgy", "student:"+student.toString());
    }
    
    private void sendDataTestArray(String[] array)
    {
        String temp = "";
        for (int i = 0; i < array.length; i++)
        {
            array[i] = "ddd"+i;
        }
        for (int i = 0; i < array.length; i++)
        {
            temp = temp+array[i];
        }
        Log.i("lgy",temp);
        //這里由于array是參數(shù)的引用药蜻,也指向this.array指向的對象瓷式,但是他并沒有被final修飾,所以可以改變它指向的對象谷暮,這個參數(shù)生命周期是在這個方法執(zhí)行完成后就消亡了
        //所以如果我再給array初始化蒿往,那么這個引用就會指向另一個對象,那么修改array將不會改變this.array的值
        String[] strings= {"jj","jj","jj"};
        array = strings;
        temp = "";
        for (int i = 0; i < array.length; i++)
        {
            temp = temp+this.array[i];
        }
        Log.i("lgy",temp);
        //報錯The final field Test2.array cannot be assigned湿弦,驗證了一旦引用被初始化指向一個對象瓤漏,就無法再把他改為指向另一個對象
//      String[] strings2= {"jj","jj","jj"};
//      this.array = strings;
    }
}

/*11-16 10:01:19.946: I/lgy(14797): i:6 it:6
11-16 10:01:19.946: I/lgy(14797): after i:5 it:5
11-16 10:01:19.946: I/lgy(14797): String:hello JAVA
11-16 10:01:19.946: I/lgy(14797): after String:hello
11-16 10:01:19.946: I/lgy(14797): student:name:LGY age:24
11-16 10:01:19.946: I/lgy(14797): after student:name:LGY age:24
11-16 10:01:19.946: I/lgy(14797): ddd0ddd1ddd2
11-16 10:01:19.946: I/lgy(14797): ddd0ddd1ddd2
11-16 10:01:19.946: I/lgy(14797): ddd0ddd1ddd2*/

3.final修飾方法

public class Person
{
    private String name;
    private int age;
    private int id;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    public int getId()
    {
        return id;
    }
    public final void setId(int id)
    {
        this.id = id;
    }
}

測試例子

/**
 * @author LGY
 * @time 2017-11-14
 * @action 
 * 下面這段話摘自《Java編程思想》第四版第143頁:
 * 
 * “使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義.
 * 第二個原因是效率蔬充。在早期的Java實現(xiàn)版本中蝶俱,會將final方法轉為內嵌調用。
 * 但是如果方法過于龐大饥漫,可能看不到內嵌調用帶來的任何性能提升榨呆。在最近的Java版本中,不需要使用final方法進行這些優(yōu)化了庸队』撸“
 * 因此,只有需要防任何繼承類修改該方法的情況下彻消,才考慮使用final.
 */
public class Student extends Person
{

    @Override
    public int getId()
    {
        return super.getId();
    }
    //因為在父類Person中將setId
//  public void setId(int id)
//  {
//      this.id = id;
//  }
}

4.final修飾類

public final class Person
{
    private String name;
    private int age;
    private int id;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    public int getId()
    {
        return id;
    }
    public void setId(int id)
    {
        this.id = id;
    }
}

測試例子

/**
 * @author LGY
 * @time 2017-11-14
 * @action 
 * 當用final修飾一個類時竿拆,表明這個類不能被繼承。
 * final類中的成員變量可以根據(jù)需要設為final宾尚,但是要注意final類中的所有成員方法都會被隱式地指定為final方法丙笋。
 * 可以看出,下面的類無法繼承Person
 */
//public class Test extends Person
//{
//
//}

5.源碼地址

http://download.csdn.net/download/lgywsdy/10120946

6.參考文章

https://www.cnblogs.com/dolphin0520/p/3736238.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末煌贴,一起剝皮案震驚了整個濱河市御板,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牛郑,老刑警劉巖怠肋,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異井濒,居然都是意外死亡灶似,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門瑞你,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酪惭,“玉大人,你說我怎么就攤上這事者甲〈焊校” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵虏缸,是天一觀的道長鲫懒。 經(jīng)常有香客問我,道長刽辙,這世上最難降的妖魔是什么窥岩? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮宰缤,結果婚禮上颂翼,老公的妹妹穿的比我還像新娘晃洒。我一直安慰自己,他們只是感情好朦乏,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布球及。 她就那樣靜靜地躺著,像睡著了一般呻疹。 火紅的嫁衣襯著肌膚如雪吃引。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天刽锤,我揣著相機與錄音镊尺,去河邊找鬼。 笑死并思,一個胖子當著我的面吹牛鹅心,可吹牛的內容都是我干的。 我是一名探鬼主播纺荧,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颅筋!你這毒婦竟也來了宙暇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤议泵,失蹤者是張志新(化名)和其女友劉穎占贫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體先口,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡型奥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碉京。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厢汹。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谐宙,靈堂內的尸體忽然破棺而出烫葬,到底是詐尸還是另有隱情,我是刑警寧澤凡蜻,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布搭综,位于F島的核電站,受9級特大地震影響划栓,放射性物質發(fā)生泄漏兑巾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一忠荞、第九天 我趴在偏房一處隱蔽的房頂上張望蒋歌。 院中可真熱鬧帅掘,春花似錦、人聲如沸奋姿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽称诗。三九已至萍悴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寓免,已是汗流浹背癣诱。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袜香,地道東北人撕予。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像蜈首,于是被迫代替她去往敵國和親实抡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內容

  • 參考android listview 聲明ViewHolder內部類時欢策,為什么建議使用static關鍵字這個問題也...
    合肥黑閱讀 1,263評論 0 0
  • 在Java 中吆寨,final關鍵字可以修飾 類,方法踩寇,和變量(包含成員變量和局部變量)啄清。 final 類 當用fin...
    伊凡的一天閱讀 243評論 0 2
  • final有“終態(tài)”和“不可變”的意思,它可以修飾非抽象類俺孙、非抽象方法辣卒、變量和方法參數(shù)。 一睛榄、final類 用fi...
    就是楊宗閱讀 898評論 0 1
  • 也許和一個錯誤的人分開荣茫,反而是一個好的開始。
    漣漪的微笑閱讀 201評論 0 0
  • 橘子小姐最近覺得很寂寞场靴, 應該是一種無所事事的寂寞吧计露。 她想回市場,找橘子先生憎乙,橘子大叔票罐,橘子小妹…… 要是跟他們...
    偷時光啊閱讀 119評論 0 1