您好,登錄后才能下訂單哦!
本文主要介紹了final關鍵字的使用方法及原理
具體代碼在我的GitHub中可以找到
https://github.com/h3pl/MyTech
文章首發于我的個人博客:
https://h3pl.github.io/2018/04/23/javase4
final關鍵字可以修飾類、方法和引用。
修飾類,該類不能被繼承。并且這個類的對象在堆中分配內存后地址不可變。
修飾方法,方法不能被子類重寫。
修飾引用,引用無法改變,對于基本類型,無法修改值,對于引用,雖然不能修改地址值,但是可以對指向對象的內部進行修改。
比如char[0] = 'a'。不改變對象內存地址,只改變了值。
具體看一下下面的栗子:
final class Fi { int a; final int b = 0; Integer s;
} class Si{ //一般情況下final修飾的變量一定要被初始化。 //只有下面這種情況例外,要求該變量必須在構造方法中被初始化。 //并且不能有空參數的構造方法。 //這樣就可以讓每個實例都有一個不同的變量,并且這個變量在每個實例中只會被初始化一次 //于是這個變量在單個實例里就是常量了。 final int s ; Si(int s) { this.s = s; } } class Bi { final int a = 1; final void go() { //final修飾方法無法被繼承 } } class Ci extends Bi { final int a = 1; // void go() { // //final修飾方法無法被繼承 // } } final char[]a = {'a'}; final int[]b = {1};
@Test public void final修飾類() { //引用沒有被final修飾,所以是可變的。 //final只修飾了Fi類型,即Fi實例化的對象在堆中內存地址是不可變的。 //雖然內存地址不可變,但是可以對內部的數據做改變。 Fi f = new Fi(); f.a = 1; System.out.println(f); f.a = 2; System.out.println(f); //改變實例中的值并不改變內存地址。 Fi ff = f; //讓引用指向新的Fi對象,原來的f對象由新的引用ff持有。 //引用的指向改變也不會改變原來對象的地址 f = new Fi(); System.out.println(f); System.out.println(ff); }
@Test public void final修飾方法() { Bi bi = new Bi(); bi.go();//該方法無法被子類Ci重寫 }
@Test public void final修飾基本類型變量和引用() { final int a = 1; final int[] b = {1}; final int[] c = {1}; // b = c;報錯 b[0] = 1; final String aa = "a"; final Fi f = new Fi(); //aa = "b";報錯 // f = null;//報錯 f.a = 1; }
關于字符串的內容可以在上一節查看:
https://blog.csdn.net/a724888/article/details/80042298
關于抽象類和接口的內容可以在下一節查看:
https://blog.csdn.net/a724888/article/details/80061047
更多內容請關注微信公眾號【Java技術江湖】
這是一位阿里 Java 工程師的技術小站,作者黃小斜,專注 Java 相關技術:SSM、SpringBoot、MySQL、分布式、中間件、集群、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術干貨和學習經驗,致力于Java全棧開發!(關注公眾號后回復”資料“即可領取 3T 免費技術學習資源以及我我原創的程序員校招指南、Java學習指南等資源)
**
cdn.xitu.io/2019/4/6/169f1735fd0d1d16?w=900&h=500&f=jpeg&s=109856">
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。