Java進階03-final關鍵字

前言:

在前面的文章中,我們介紹了static關鍵字的作用,現在,我們一起來聊一下final關鍵字。

首先,關於final關鍵字,我們提出三句話:

  1. 被final修飾的變量是不可以改變的
  2. 被final修飾的方法不可以被重寫
  3. 被final修飾的類不可以被繼承

在《java編程思想》中,有這樣一句話,“這是無法改變的”。這裏,我們討論使用final的三種情況:數據、方法和類

1、final數據:

1)一個永不改變的編譯時常量。在Java中,這類常量必須是基本數據類型,並且以關鍵字final表示。final成員變量必須在聲明的時候初始化或者在構造器中初始化,否則就會報編譯錯誤。

這裏寫圖片描述

package com.hlk;

import java.util.Random;

class Value {
    int i;
    public Value(int i) {
        this.i = i;
    }
}

public class Final_Test {

    private static Random random = new Random(100);
    private String id;

    public Final_Test() {
    }
    public Final_Test(String id) {
        this.id = id;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    private final int valueOne = 10;
    private static final int valueTwo = 10;
    public static final int valueThree = 30;
    private final int i4 = random.nextInt(20);
    static final int i5 = random.nextInt(30);

    private Value v1 = new Value(11);
    private final Value v2 = new Value(22);
    private static final Value v3 = new Value(33);

    //Arrays:
    private final int[] a = {1,2,3,4,5,6};

    @Override
    public String toString() {
        return "i4 = " + i4 + ",i5 = " + i5;
    }

    public static void main(String[] args) {
        Final_Test f1 = new Final_Test();

        //f1.valueOne++;  報錯,因爲final定義的數據不可改變
        f1.v2.i++;
        f1.v3.i++;

        System.out.println(f1);
        System.out.println("f1.v2.i: " + f1.v2.i);
        System.out.println("f1.v3.i: " + f1.v3.i);

        /**
         * 引用的內容可以改變,但是引用不可以被改變
         */
        final Final_Test id1 = new Final_Test("id1");
        final Final_Test id2 = new Final_Test("id2");

        id1.setId("change_id1");
        System.out.println(id1.getId());//id1被改變

        //id1 = id2;//報錯The final local variable id1 cannot be assigned.
    }
}

對於基本數據類型,final使數值恆定不變;而用於對象引用,final使引用恆定不變。一旦引用被初始化指向一個對象,就無法再把它改爲指向另一個對象。

重點:
在這裏,我們提出一個問題,這裏所說的被final修飾的變量不可以被改變,是什麼不可以被改變?變量的內容?還是變量的引用?
答:根據上面的內容,我們可以看出,被final修飾不可變的是變量的引用,而不是引用指向的內容,引用指向的內容是可以改變的

2、final方法:

父類的final方法是不能被子類所重寫的,也就是說子類是不能夠存在和父類一模一樣的方法的。

3、final類:

在開發中,出於安全或者其它原因考慮,我們不希望該類被繼承,就使用final來修飾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章