java基礎4:深刻理解final關鍵字

本文主要介紹了final關鍵字的使用方法及原理java

具體代碼在個人GitHub中能夠找到git

https://github.com/h2pl/MyTech

文章首發於個人我的博客:程序員

https://h2pl.github.io/2018/0...

<!-- more -->github

final關鍵字能夠修飾類、方法和引用。

修飾類,該類不能被繼承。而且這個類的對象在堆中分配內存後地址不可變。微信

修飾方法,方法不能被子類重寫。網絡

修飾引用,引用沒法改變,對於基本類型,沒法修改值,對於引用,雖然不能修改地址值,可是能夠對指向對象的內部進行修改。多線程

好比char[0] = 'a'。不改變對象內存地址,只改變了值。分佈式

具體看一下下面的栗子:學習

final class Fi {this

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};

final修飾類

@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);
}

final修飾方法

@Test
public void final修飾方法() {
    Bi bi = new Bi();
    bi.go();//該方法沒法被子類Ci重寫

}

final修飾基本數據類型變量和引用

@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...

關於抽象類和接口的內容能夠在下一節查看:

https://blog.csdn.net/a724888...

更多內容請關注微信公衆號【Java技術江湖】

這是一位阿里 Java 工程師的技術小站,做者黃小斜,專一 Java 相關技術:SSM、SpringBoot、MySQL、分佈式、中間件、集羣、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!(關注公衆號後回覆」資料「便可領取 3T 免費技術學習資源以及我我原創的程序員校招指南、Java學習指南等資源)

**

相關文章
相關標籤/搜索