【IT領域新生必看】解鎖 `final` 關鍵字的秘密:Java 編程中的終極武器

文章目錄

        • 引言
        • 什么是 `final` 關鍵字?
        • 一、 `final` 變量
          • `final` 局部變量
          • `final` 實例變量
          • `final` 靜態變量
        • 二、 `final` 方法
        • 三、 `final` 類
        • 四、 `final` 關鍵字的實際應用
          • 1. 定義常量
          • 2. 防止方法被重寫
          • 3. 創建不可變類
          • 4. 優化性能
        • 五、 `final` 的一些常見誤區
          • 1. `final` 變量不能在構造方法中賦值
          • 2. `final` 類中的所有方法都是 `final` 的
          • 3. `final` 變量的引用不能改變
        • 結論

在這里插入圖片描述

引言

在編程的世界里,關鍵字是語言設計者賦予開發者的強大工具,每個關鍵字都有其獨特的用途和重要性。對于Java程序員來說,final 是一個極其重要且常用的關鍵字。它不僅有助于提高代碼的安全性和穩定性,還能優化性能,幫助開發者編寫更高效的代碼。但是,final 關鍵字的用途和使用場景可能讓初學者感到困惑。今天,我們將深入探討Java中的 final 關鍵字,揭示它的真正威力,并展示如何在實際編程中巧妙地運用它。

什么是 final 關鍵字?

在Java中,final 是一個特殊的關鍵字,它可以用于變量、方法和類,表示它們不能被修改。具體來說:

  • final 變量:表示常量,一旦賦值就不能更改。
  • final 方法:表示該方法不能被子類重寫。
  • final 類:表示該類不能被繼承。
一、 final 變量

final 關鍵字用于變量時,它表示這個變量一旦被賦值,就不能再改變。這種變量通常被稱為常量。

final 局部變量

局部變量是在方法、構造方法或塊中聲明的變量。當局部變量被聲明為 final 時,它在賦值后就不能再被修改。

public class FinalExample {public void demonstrateFinalLocalVariable() {final int CONSTANT_VALUE = 10;System.out.println("Constant Value: " + CONSTANT_VALUE);// 下面的代碼將會報錯,因為 CONSTANT_VALUE 是 final 的,不能再被修改// CONSTANT_VALUE = 20;}public static void main(String[] args) {FinalExample example = new FinalExample();example.demonstrateFinalLocalVariable();}
}

在這個例子中,CONSTANT_VALUE 是一個 final 變量,賦值為10后不能再被修改。如果嘗試重新賦值,編譯器會報錯。

final 實例變量

實例變量是屬于對象的變量。當實例變量被聲明為 final 時,它必須在對象初始化時賦值(即在構造方法中賦值),并且一旦賦值就不能再改變。

public class FinalExample {private final int id;public FinalExample(int id) {this.id = id;}public void showId() {System.out.println("ID: " + id);}public static void main(String[] args) {FinalExample example = new FinalExample(1);example.showId();// 下面的代碼將會報錯,因為 id 是 final 的,不能再被修改// example.id = 2;}
}

在這個例子中,id 是一個 final 實例變量,必須在構造方法中賦值,并且賦值后不能再被修改。

final 靜態變量

靜態變量是屬于類的變量,當靜態變量被聲明為 final 時,它成為一個常量,必須在聲明時或在靜態初始化塊中賦值,并且賦值后不能再改變。

public class FinalExample {public static final int MAX_VALUE = 100;public static void main(String[] args) {System.out.println("Max Value: " + MAX_VALUE);// 下面的代碼將會報錯,因為 MAX_VALUE 是 final 的,不能再被修改// MAX_VALUE = 200;}
}

在這個例子中,MAX_VALUE 是一個 final 靜態變量,它在聲明時被賦值為100,并且不能再被修改。

二、 final 方法

final 關鍵字用于方法時,表示該方法不能被子類重寫。這對于設計不可變類或防止子類改變關鍵行為非常有用。

public class FinalExample {public final void showMessage() {System.out.println("This is a final method");}
}class SubClass extends FinalExample {// 下面的代碼將會報錯,因為 showMessage 是 final 的,不能被重寫// @Override// public void showMessage() {//     System.out.println("Attempting to override final method");// }
}public class Main {public static void main(String[] args) {SubClass subClass = new SubClass();subClass.showMessage();}
}

在這個例子中,showMessage 方法被聲明為 final,因此它不能被 SubClass 重寫。如果嘗試重寫,編譯器會報錯。

三、 final

final 關鍵字用于類時,表示該類不能被繼承。這對于設計不可變類或確保類的完整性非常有用。

public final class FinalExample {public void showMessage() {System.out.println("This is a final class");}
}// 下面的代碼將會報錯,因為 FinalExample 是 final 的,不能被繼承
// class SubClass extends FinalExample {
// }public class Main {public static void main(String[] args) {FinalExample example = new FinalExample();example.showMessage();}
}

在這個例子中,FinalExample 類被聲明為 final,因此它不能被繼承。如果嘗試繼承,編譯器會報錯。

四、 final 關鍵字的實際應用

final 關鍵字在實際編程中有廣泛的應用,以下是一些常見的使用場景:

1. 定義常量

在程序中定義常量時,通常使用 final 關鍵字。這可以確保常量的值在整個程序中保持不變。

public class Constants {public static final String APP_NAME = "My Application";public static final int MAX_USERS = 100;public static void main(String[] args) {System.out.println("App Name: " + APP_NAME);System.out.println("Max Users: " + MAX_USERS);}
}
2. 防止方法被重寫

在設計類時,某些方法可能不希望被子類重寫,以確保其行為的一致性和完整性。此時可以將方法聲明為 final

public class BaseClass {public final void logAction(String action) {System.out.println("Action: " + action);}
}class SubClass extends BaseClass {// logAction 方法不能被重寫
}public class Main {public static void main(String[] args) {SubClass subClass = new SubClass();subClass.logAction("Login");}
}
3. 創建不可變類

不可變類是指一旦創建就不能修改的類。通過將類聲明為 final 并將其所有成員變量聲明為 final,可以實現不可變類。

public final class ImmutablePerson {private final String name;private final int age;public ImmutablePerson(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}public class Main {public static void main(String[] args) {ImmutablePerson person = new ImmutablePerson("Alice", 30);System.out.println("Name: " + person.getName());System.out.println("Age: " + person.getAge());// 下面的代碼將會報錯,因為 ImmutablePerson 是不可變的// person.name = "Bob";// person.age = 25;}
}
4. 優化性能

在某些情況下,將方法或類聲明為 final 可以幫助Java編譯器進行優化,提高性能。這是因為編譯器可以確定這些方法或類不會被重寫,從而進行內聯優化。

五、 final 的一些常見誤區

在使用 final 關鍵字時,初學者可能會遇到一些常見的誤區。了解這些誤區可以幫助你更好地使用 final 關鍵字。

1. final 變量不能在構造方法中賦值

這是一個常見的誤解。實際上,final 實例變量可以在聲明時賦值,也可以在構造方法中賦值。

public class FinalExample {private final int value;public FinalExample(int value) {this.value = value;}
}
2. final 類中的所有方法都是 final

雖然 final 類不能被繼承,但這并不意味著其所有方法都是 final 的。方法是否為 final 需要顯式聲明。

public final class FinalClass {public void method1() {System.out.println("Method1");}public final void method2() {System.out.println("Method2");}
}

在這個例子中,`

method1不是final的,而method2final` 的。

3. final 變量的引用不能改變

對于引用類型的 final 變量,final 關鍵字只保證引用本身不能改變,但引用的對象內容可以改變。

public class FinalExample {private final StringBuilder builder = new StringBuilder();public void appendText(String text) {builder.append(text);}public String getText() {return builder.toString();}public static void main(String[] args) {FinalExample example = new FinalExample();example.appendText("Hello, ");example.appendText("World!");System.out.println(example.getText());// 下面的代碼將會報錯,因為 builder 是 final 的,不能再賦值// example.builder = new StringBuilder();}
}

在這個例子中,builder 是一個 final 引用,雖然引用不能改變,但 StringBuilder 對象的內容可以改變。

結論

final 關鍵字是Java編程中一個非常重要的工具,它有助于提高代碼的安全性、穩定性和性能。通過理解和正確使用 final 關鍵字,我們可以編寫出更健壯、更高效的代碼。

無論是定義常量、防止方法被重寫、創建不可變類,還是優化性能,final 關鍵字都扮演著重要的角色。希望通過這篇文章,你能更深入地理解 final 關鍵字的使用場景和實際應用,讓你的編程技能更上一層樓。

繼續探索和實踐 final 關鍵字的各種用法吧,你會發現它在編程中是一個不可或缺的終極武器!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43491.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43491.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43491.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣995.K連續位的最小翻轉次數

力扣995.K連續位的最小翻轉次數 因為翻轉順序改變不影響最終結果 因此從頭找每個位置翻轉后的結果如果為0 將從它開始的K長的數組翻轉 class Solution {public:int minKBitFlips(vector<int>& nums, int k) {int n nums.size();vector<int> s(n1);int res0…

05.FFMPEG日志系統

一、頭文件 #include <libavutil/log.h> 二、常用函數 1、av_log_set_level void av_log_set_level(int level);該函數用于設置全局日志級別。 2、av_log void av_log(void* avcl, int level, const char* fmt, ...);該函數用于輸出日志消息。avcl 參數是相關聯的上下…

uboot學習:(三)目錄分析

目錄 目錄分析 uboot自帶 編譯生成的文件 分析之前需要編譯一次uboot源碼&#xff0c;編譯之后的uboot源碼會多出來很多文件 目錄分析 uboot自帶 api 與硬件無關的API函數arch 與架構體系有關的代碼 里面有x86,arm等架構文件夾 架構文件夾里面有cpu&#xff0c;設備樹等…

使用 Nuxt 3 搭建國際官網

搭建國際官網是一個復雜的任務,涉及多方面的技術和策略。在這篇文章中,我們將探討如何使用 Nuxt 3 框架搭建一個國際化官網,并展示其在 SEO 優勢和全棧可維護性方面的卓越性能。 使用 Nuxt 3 搭建國際官網 1. Nuxt 3 簡介 Nuxt 3 是一個基于 Vue 3 和 Vite 的框架,旨在構…

大數據面試題之ElasticSearch(2)

目錄 ElasticSearch的單播、多播和廣播 什么是Zen Discovery機制 ElasticSearch和Solr主要區別 ElasticSearch和Solr各自適用于哪些場景 Elasticsearch的同類產品有哪些 Elasticsearch有哪些主要應用場景 Elasticsearch 中執行搜索的各種可能方式有哪些 Elasticsearch 中…

UWB系列教程(一)UWB簡介

UWB系列教程&#xff08;一&#xff09;&#xff1a;UWB簡介 超寬帶&#xff08;Ultra-Wideband, UWB&#xff09;技術作為一種先進的無線通信技術&#xff0c;近年來在多個領域展現出了巨大的潛力和應用前景。 什么是超寬帶&#xff08;UWB&#xff09;技術&#xff1f; 超…

Java中的數據緩存技術及其應用

Java中的數據緩存技術及其應用 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代應用程序中&#xff0c;數據緩存是一種重要的技術手段&#xff0c;用于提…

linux中的僵尸進程

僵尸進程&#xff08;Zombie Process&#xff09;是指在操作系統中&#xff0c;一個進程已經終止執行了&#xff08;即已經退出&#xff09;&#xff0c;但是其父進程還沒有通過 wait() 系統調用來獲取該進程的終止狀態&#xff08;exit status&#xff09;&#xff0c;因此該進…

Python面試寶典第10題:精選選擇題

題目1 在以下函數中&#xff0c;b和a的關系是___。 def add_one_to_list(lst):lst.append(1)return lsta [1, 2, 3] b add_one_to_list(a) A. b是a的淺拷貝 B. b和a是同一個列表對象 C. b是a的深拷貝 D. b是a的一個子列表 題目2 以下函數的作用是___。 def operate_s…

C++多態的實現原理

靜態多態&#xff08;編譯期&#xff09; 函數重載&#xff1a; 允許在同一個作用域中聲明多個功能類似的同名函數函數的參數列表不同&#xff08;參數個數&#xff0c;參數類型&#xff0c;參數順序&#xff09;注意&#xff1a;不能通過函數返回值區分&#xff08;name man…

(補充)IDEA項目結構

文章目錄 前言一、pycharm中Python項目結構二、IDEA中的java項目結構設計總結前言 本文主要介紹一下pycharm和IDEA里面的項目結構的使用方法 一、pycharm中Python項目結構 之前我們在pycharm做過python項目,項目結構很清晰,還是比較靈活的。 一般項目里面就是 數據驅動、數…

【JavaSE】程序邏輯控制

目錄 1. 順序結構 2. 分支結構 2.1 if語句 2.1.1 語法格式1 2.1.2 語法格式2 2.1.3 語法格式3 2.1.4 練習 2.1.5 注意事項 2.2 switch 語句 3. 循環結構 3.1 while循環 3.1.1 語法格式 3.1.2 代碼示例 3.1.3 注意事項 3.2 break 3.3 continue 3.4 for循環 …

scratch3編程05-畫筆繪制圓及與圓相關的圖形

目錄 一&#xff0c;圓 1&#xff0c;空心圓 2&#xff0c;實心圓 3&#xff0c;嵌套在一起的圓 4&#xff0c;圓環 二&#xff0c;五角星 1&#xff0c;空心五角星 1&#xff09;思路 2&#xff09;完整的程序 2&#xff0c;實心五角星 1&#xff09;思路 2&…

C# 預處理器指令

C# 預處理器指令 概述 C# 預處理器指令是編譯器在編譯代碼之前處理的指令。這些指令用于控制編譯過程,包括條件編譯、編譯指令的定義和取消等。預處理器指令以 # 開頭,不包含在代碼的執行邏輯中,僅在編譯階段起作用。 常用的預處理器指令 1. #define 和 #undef #define…

RK3568筆記三十三: helloworld 驅動測試

若該文為原創文章&#xff0c;轉載請注明原文出處。 報著學習態度&#xff0c;接下來學習驅動是如何使用的&#xff0c;從簡單的helloworld驅動學習起。 開始編寫第一個驅動程序—helloworld 驅動。 一、環境 1、開發板&#xff1a;正點原子的ATK-DLRK3568 2、系統&#xf…

d3dcompiler_43.dll文件是什么?如何快速有效的解決d3dcompiler_43.dll文件丟失問題

dcompiler_43.dll 是一個Windows系統中的系統文件&#xff0c;屬于DirectX軟件的一部分。這個dcompiler_43.dll&#xff08;動態鏈接庫&#xff09;文件主要用于處理與3D圖形編程有關的任務&#xff0c;是運行許多游戲和高級圖形程序必需的組件之一。那么如果電腦丟失d3dcompil…

香蕉派BPI-Wifi6迷你路由器公開發售

Banana Pi BPI-Wifi6 Mini 公開發售。 Banana Pi BPI-Wifi6 Mini 開源路由器采用Triductor TR6560 TR5220 wifi SOC設計&#xff0c;是一款迷你尺寸的wifi6路由器解決方案。內置高性能雙核ARM Cortec A9處理器用于WIFI報文轉發或智能業務處理&#xff0c;內置高性能LSW和硬件N…

[NeetCode150] String Encode and Decode

String Encode and Decode Design an algorithm to encode a list of strings to a single string. The encoded string is then decoded back to the original list of strings. Please implement encode and decode Example 1: Input: [“neet”,“code”,“love”,“you…

ubuntu 上vscode +cmake的debug調試配置方法

在ubuntu配置pcl點云庫以及opencv庫的時候&#xff0c;需要在CMakeLists.txt中加入相應的代碼。配置完成后&#xff0c;無法調試&#xff0c;與在windows上體驗vs studio差別有點大。 找了好多調試debug配置方法&#xff0c;最終能用的有幾種&#xff0c;但是有一種特別好用&a…

ubuntu部署minio集群

minio集群介紹 官方文檔&#xff1a;https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html 本方案采用在多節點多驅動器 (MNMD) 或“分布式”配置部署 MinIO。 MNMD 部署提供企業級性能、可用??性和可擴展性&#…