中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

聊聊java中final那點事

發布時間:2020-08-01 01:59:16 來源:網絡 閱讀:457 作者:2578612215 欄目:編程語言

1.final是什么

final是一個java關鍵字,一個修飾符,可用于修飾變量,方法,修飾類.

2.final有什么用

  • final可以修飾變量時,可以使其值不能改變
  • final修飾方法時使其不能被重寫
  • final修飾類時,使其不能被繼承.

    3.final修飾成員變量

    fianl最常見的用法時用來修飾成員變量,成員變量分為靜態變量與普通變量.
    對于final修飾的變量,不是不能被賦值,是其值不能被改變,可以理解成只能賦一次值.可以在定義時賦值,也可以在定義后在另外賦值,但無論何種方式只能被賦值一次.

    (1)修飾靜態變量

    修飾靜態變量時,可以選擇以下兩種方式賦值:

  • 在定義時賦值
  • 靜態初始化塊內賦值
final static int a = 6;
final static int b;
static 
{
    b = 6;
}

(2)修飾普通成員變量

修飾普通成員變量時,可以選擇以下三種方式賦值:

  • 定義時賦值
  • 初始化塊內賦值
  • 構造方法賦值
public class test
{
    int c = 1;
    int d;
    int e;
    {
        d = 2;
    }
    public test()
    {
        e = 3;
    }
}

根據"靜態"不能訪問"非靜態"規則,就是說靜態的方法不能訪問非靜態成員,static初始化塊不能初始化非靜態成員,普通初始化塊也不能初始化靜態變量.
但是,有一個"bug"就是java允許通過方法訪問final成員,因此...有趣的事情發生了.

public class test
{
    final int a;
    {
        System.out.println(a);//這里會報錯
        printA();
        a = 3;
        printA();
    }
    void printA()
    {
        System.out.println(a);
    }
    public static void main(String[] args) {
        new test();
    }
}

以上這段代碼會報錯,因為java不允許final成員未初始化前訪問.

聊聊java中final那點事
把上面那一行出錯的代碼注釋后...居然通過了編譯?!

public class test
{
    final int a;
    {
        //System.out.println(a);//這里會報錯
        printA();
        a = 3;
        printA();
    }
    void printA()
    {
        System.out.println(a);
    }
    public static void main(String[] args) {
        new test();
    }
}

printA()中只是用方法包裝了一下輸出函數,居然就通過了編譯...有沒有興趣看一下結果?

聊聊java中final那點事
emmmmmm....final"默認值"為0.....總之就不要想這些歪門邪道去在final初始化之前訪問final變量了 ,在使用final變量前初始化,初始化,初始化,重要的事情說三遍.

4.final修飾局部變量

final修飾局部變量其實也分兩種,一種是修飾形參,一種是修飾方法內部的局部變量

(1)修飾形參

沒什么好說的...就是形參的值不能改變.

public void f(final int a)
{
    a = 3;//報錯.
}

(2)修飾局部變量

修飾局部變量時可以定義時賦值,也可以在定義后在賦值(僅一次).

public void f()
{
    final int  a = 3;
    final int b;
    b = 2;
}

(3)final修飾引用變量

嗯.....這個是一個特別一點的例子,Talk is cheap.上代碼.

import java.util.Arrays;

public class test
{
    public static void main(String[] args) {
        final int[] arr = {1,2,3};
        arr[1] = 5;
        Arrays.stream(arr).forEach(System.out::print);
        System.out.println();
        final A a = new A();
        a.setA(9);
        System.out.println(a.getA());
    }
}

class A
{
    private int a = 3;
    public void setA(int a)
    {
        this.a = a;
    }
    public int getA()
    {
        return a;
    }
}

為什么final數組可以賦值???fianl對象的值被改變了???看看結果:
聊聊java中final那點事
final數組居然被改變了??final對象的值也被改變了??
其實呢,因為數組是引用類型,final修飾引用類型時,只能保證這個變量永遠"指向"那一段內存空間,保存的僅僅是一個引用,但是那段內存空間的值是可以改變的.修飾對象時也是一樣的道理.

5.final修飾方法

final修飾的方法不能被重寫,當然,不能"配合"private"使用",因為private把方法變成了私有,相當于對子類不可見,子類都不知道父類"還有這玩意",就可以進行所謂的"重寫"了.

class A
{
    private final void f(){}
}
class B extends A
{
    public final void f(){}//沒毛病
}

因為B類的f()是屬于B類的,不是從A類繼承過來的.

6.final修飾類

final修飾類時表示該類不能被繼承.

final class A{}
class B extends A{}//出錯
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

水富县| 新昌县| 兴城市| 蕉岭县| 手游| 廊坊市| 拜泉县| 即墨市| 宣恩县| 高台县| 莱州市| 井冈山市| 普定县| 赤壁市| 宿迁市| 井陉县| 水城县| 泰和县| 平塘县| 时尚| 阜新市| 衡阳市| 资阳市| 屏边| 江阴市| 扬州市| 南安市| 大姚县| 南开区| 班玛县| 巴青县| 连平县| 万州区| 大连市| 桐梓县| 辉县市| 方山县| 肃南| 灌阳县| 突泉县| 关岭|