自學Java之day11_java關鍵字final

原文鏈接:www.baidu.com

final關鍵字的概述

學習了繼承後,我們知道,子類可以在父類的基礎上改寫父類內容,比如,方法重寫。那麼我們能不能隨意的繼承 API中提供的類,改寫其內容呢?顯然這是不合適的。爲了避免這種隨意改寫的情況,Java提供了 final 關鍵字, 用於修飾不可改變內容。

final關鍵字常見的四種用法

常見四種用法:

  • 可以用來修飾一個類
  • 可以用來修飾一個方法
  • 還可以用來修飾一個局部變量
  • 還可以用來修飾一個成員變量

修飾一個類

含義:當前這個類不能有任何的子類。一個類如果是final的,那麼其中所有的成員方法都無法進行覆蓋重寫。final類可以覆蓋重寫其父類中的方法。

格式:

final class 類名 {

        //方法體

}

例如:

public final class MyClass /*extends Object*/ {
    public void method() {
        System.out.println("我是一個final類");
    }
}

修飾一個方法

含義:當final關鍵字用來修飾一個方法的時候,這個方法就是最終方法,也就是不能被覆蓋重寫。

格式:

修飾符 final 返回值類型 方法名(參數列表){

            //方法體

}

例如:

public class Fu {
    public final void method(){
        System.out.println("此方法是被final修飾,無法被覆蓋重寫");
    }
}

注意事項:

  • 對於類、方法來說,abstract關鍵字和final關鍵字不能同時使用,因爲矛盾。

修飾成員變量

基本類型的局部變量,final修飾後,只能賦值一次,不能再更改。一次賦值,終生不變

例如:

public class FinalDemo1 {
    public static void main(String[] args) {
        // 聲明變量,使用final修飾
        final int a;
        // 第一次賦值
        a = 10;
        // 第二次賦值
        a = 10; // 報錯,不可重新賦值
        // 聲明變量,直接賦值,使用final修飾
        final int b = 10;
        // 第二次賦值
        b = 20; // 報錯,不可重新賦值
    }
}

引用類型的局部變量,被final修飾後,只能指向一個對象,地址不能再更改。但是不影響對象內部的成員變量值的修改

例如:

定義Person類

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public Person() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

定義測試類

public class FinalDemo02 {
    public static void main(String[] args) {
        // 創建被final 修飾的對象
        final Person person = new Person("張三");
        //內存地址不可改變,妹new一次就是創建一個新的對象,內存地址不同
        //person = new Person("李四");錯誤
        //輸出對象的成員變量name的值
        System.out.println(person.getName());
        //改變對象的成員變量name的值
        person.setName("李四");
        //輸出對象的成員變量name的值
        System.out.println(person.getName());
    }
}

代碼執行後的結果

修飾成員變量

對於成員變量來說,如果使用final關鍵字修飾,那麼這個變量也照樣是不可變。

注意

  • 由於成員變量具有默認值,所以用了final之後必須手動賦值,不會再給默認值了。
  • 對於final的成員變量,要麼使用直接賦值,要麼通過構造方法賦值。二者選其一。
  • 必須保證類當中所有重載的構造方法,都最終會對final的成員變量進行賦值。

例如

直接賦值

// 顯示初始化;直接賦值
public class User {
    final String USERNAME = "張三";
    private int age;
}

構造方法賦值


//構造方法初始化。構造方法進行賦值
public class Student {
    //被final修飾的常量名稱,一般都有書寫規範,所有字母都大寫。
    final String USERNAME;
    private int age;

    public Student(String username, int age) {
        this.USERNAME = username;
        this.age = age;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章