java static和final關鍵字

来源:https://www.cnblogs.com/NealRiver/archive/2018/07/21/9346111.html
-Advertisement-
Play Games

static 用法 1.static 變數 static變數又稱為靜態變數,靜態變數保存在方法區靜態域中,一個類的靜態變數被其所有實例共用。 2.static方法 靜態方法不與包含它的任何對象關聯,即使沒有創建對象,也可使用,例: 1 public class StaticTest { 2 3 pu ...


static 用法

1.static 變數

static變數又稱為靜態變數,靜態變數保存在方法區靜態域中,一個類的靜態變數被其所有實例共用。

2.static方法

靜態方法不與包含它的任何對象關聯,即使沒有創建對象,也可使用,例:

 1 public class StaticTest {
 2 
 3     public static void sayHello(){
 4         System.err.println("Hello");
 5     }
 6 
 7 }
 8 
 9 class Greeting{
10 
11     public static void main(String[] args) {
12         StaticTest.sayHello();
13     }
14 }
View Code

3.static代碼塊

static代碼塊在類初次被引用或者實例化時執行且只執行一次,一個類里可以有多個static代碼塊,會按照順序執行,例:

 1 public class StaticTest {
 2 
 3     static {
 4         System.err.println("Wave hands");
 5     }
 6 
 7     public static void sayHello(){
 8         System.err.println("say Hello");
 9     }
10 
11 }
12 
13 class Greeting{
14 
15     public static void main(String[] args) {
16         StaticTest.sayHello();
17     }
18 }
View Code

4.static類

普通類是不能被static修飾的,static只能修飾內部類;這種內部類通常稱為 嵌套類

“如果不需要內部類對象與其外圍類對象之間有聯繫,那麼可以將內部類聲明為static”(《java編程思想p201》);

普通的內部類對象都會隱式的保存一個引用指向創建他的外部類,然而關於嵌套類:

1)要創建嵌套類的對象,並不需要其外圍類的對象。

2)不能從嵌套類的對象中訪問非靜態的外圍類對象。

例如jdk中ThreadLocal類就有較多的應用;

/**關於內部類部分後續討論*/

擴展內容

類從載入到虛擬機記憶體中開始,到卸載記憶體位置,它的真個聲明周期包括:載入、驗證、準備、解析、初始化、使用、卸載;

有且僅有以下四種情況下,類必須進行初始化

1)遇到new(使用new關鍵字實例化對象)

getstatic、putstatic(讀取或設置一個類的靜態欄位(被final修飾、已在編譯期把結果放入常量池的靜態欄位除外))

invokestatic(調用一個類的靜態方法的時候)

2)使用java.lang.reflect包的方法對類進行反射調用的時候

3)初始化一個類時,發現其父類沒有進行過初始化的時候

4)當虛擬機啟動時,用戶需要指定一個要執行的主類,虛擬機會初始化這個主類;

對於靜態欄位,只有直接引用定義這個欄位的類才會觸發該類的初始化,而通過子類引用父類的欄位,只會觸發父類的初始化,而不會觸發子類的初始化,例:

 1 package com.neal.tutorial.basic.keyword;
 2 
 3 public class StaticTest {
 4 
 5     static int a = 5;
 6 
 7     static {
 8         System.err.println("a in parent: " + a);
 9     }
10 
11 }
12 
13 class SubStatic extends StaticTest {
14 
15     static int b = 10;
16 
17     static{
18         System.err.println(b);
19     }
20 
21 }
22 
23 class Greeting {
24 
25     public static void main(String[] args) {
26         System.err.println(SubStatic.a);
27     }
28 }
View Code

輸出結果為

1 a in parent: 5
2 5
View Code

可以看出子類中靜態代碼塊並沒有執行;

final關鍵字用法

1.變數

1)基本類型:

當我們需要一個編譯時不改變常量,或者一個運行時被初始化後就不改變的值時,通常定義一個final修飾的基本類型變數

當與static一起使用時,意為一個只有一份的常量(即多個實例共用)

2)對象:

當變數類型為對象時,final變數的引用在初始化後不可更改,但是引用指向的對象值是可變的,例如數組、Map、List等

3)參數列表

當在參數列表中聲明參數為final時,意味著在方法中只能讀取參數引用的對象,而無法修改參數引用指向的對象,這一特性主要用於向匿名內部類傳遞參數

2.final方法

final方法一般用於兩種情景下

1)想要鎖定方法,防止任何繼承類修改它的含義,確保在繼承中使方法行為保持不變,並且不會被覆蓋

2)出於性能考慮,在java早期實現中(現在不鼓勵這麼做)如果一個方法被指明為final,就是允許編譯器將針對該方法的所有調用都轉為內嵌調用

內嵌機制是指final方法會在編譯時進行inline優化,即在編譯時直接調用方法代碼替換,而不是在運行時。而非final方法可能存在被子類重寫,由於多態的原因,並不能在編譯時就確定調用的是哪個方法

3.final類

final類不能夠被繼承,一般在確定該類不需要子類時,將類定義為final類型

在jdk源碼中,String類就被定義為final類型

 

參考:

https://www.zhihu.com/question/64763016/answer/223938175

《java編程思想》第四版

 

ps.小王知識點 :當你舉起屠刀的那一刻,就將知道自己必將死於刀下


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.建立一個項目,導入jar包(ioc aop dao 連接池 資料庫驅動包)拷貝Spring容器對應的配置文件到src下 2.在配置文件中引入外部屬性文件 3.配置數據源 4.配置JdbcTemplate 5.設置屬性 6.測試 db.properties 1 driverClassName=or ...
  • Collections對List集合中的數據進行排序 有時候需要對集合中的元素按照一定的規則進行排序,這就需要用到 Java中提供的對集合進行操作的工具類Collections,其中的sort方法 先看一個簡單的例子: reference: https://blog.csdn.net/veryisj ...
  • groupby()函數同時返回分組關鍵字和一個與關鍵字相對應的可迭代對象,也可以使用defaultdict()創建一個一對多字典方便進行隨機訪問 ...
  • 先安裝VS2017,然後在安裝WDK,WDK會自動關聯到VS2017中,不用你任何操作,自動在新建項目中可以找到驅動開發。 如果以上安裝完成後,在VS2017中新建項目中沒有發現WDK,那麼需要進行修複。 修複的方法:進入WDK安裝後的文件夾中,找到Vsix這個文件夾,雙擊運行WDK.vsix,程式 ...
  • 1 // C++函數和類 13-函數與string對象.cpp: 定義控制台應用程式的入口點。 2 // 3 4 #include "stdafx.h" 5 #include 6 #include 7 #include 8 #include 9 #include 10 using namespace... ...
  • 1 // C++函數和類 05-返回類型.cpp: 定義控制台應用程式的入口點。 2 // 3 4 #include "stdafx.h" 5 #include 6 #include 7 #include 8 #include 9 #include 10 using namespace std; 1... ...
  • 1 // C++函數和類 01-函數.cpp: 定義控制台應用程式的入口點。 2 // 3 4 #include "stdafx.h" 5 #include 6 #include 7 #include 8 #include 9 #include 10 using namespace std; 11 ... ...
  • c/c++ 用前序和中序,或者中序和後序,創建二叉樹 用前序和中序創建二叉樹 用後序和中序創建二叉樹 bintreemain.c "完整代碼" 編譯方法:g++ g nodestack.c nodequeue.c bintree.c bintreemain.c ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...