java面向對象進階篇--static

一、前言

java進階篇已經開始了,先從面向對象開始,由于時間原因今天就只更新了static部分,內容上特別詳細,一些特別的注意事項也在反復的提醒大家。

溫馨提示一下,往后的java篇會越來越難,希望大家能夠堅持下去。大家一起努力!!!

二、基礎概念

定義靜態變量

靜態變量使用 static 關鍵字聲明。通常在類級別、方法外部定義,并且在整個類的生命周期內存在一份實例。靜態變量可以是基本數據類型(如 intdouble 等)或引用類型(如對象的引用)。

?訪問靜態變量

靜態變量可以通過類名直接訪問,也可以通過對象實例訪問,但推薦使用類名訪問,因為靜態變量不是對象的一部分。

靜態變量的初始化

靜態變量可以在聲明時初始化,也可以在靜態初始化塊中初始化。靜態初始化塊在類加載時執行,并且僅執行一次。

特點與注意事項

  • 類級別共享:靜態變量的值對所有類的實例來說是共享的,它們只有一份拷貝存在于內存中。

  • 生命周期:靜態變量隨著類的加載而初始化,而不是隨著對象的創建而初始化。它們存在于整個類的生命周期內,直到程序結束或類被卸載。

  • 線程安全:靜態變量在多線程環境下可能存在并發訪問的問題,因此需要考慮線程安全性,可以使用 synchronized 關鍵字或其他并發控制機制來保護靜態變量的訪問。

  • 命名規范:通常靜態變量的命名習慣是使用大寫字母和下劃線分隔單詞(例如 MAX_SIZE),以區分于實例變量。

  • 應用場景:靜態變量通常用于表示類的常量(如 Math.PI)、計數器(記錄類實例創建次數)、單例模式中的實例等場景。

三、static靜態變量

?看上圖可以發現,李四的輸出信息中沒有老師的姓名,那是因為李四并沒有給teacher這個變量賦值。

總所周知,在一個教室中,老師是學生們共有的,所以有沒有一種方法使得所有學生都能有這一屬性呢,答案當然是有的。這就得使用我們的static靜態變量了。

代碼優化:

Student.teacher = "李老師";
Student student = new Student();
student.setName("張三");
student.setAge(18);
student.setGender("男");student.study();
student.show();Student student1 = new Student("李四", 19, "女");
student1.study();
student1.show();

運行結果:

思考一下teacher這一變量并沒有賦值給學生,但是每個學生都有這一屬性。

這就是靜態變量的神奇之處,?

好好的去理解一下這句話。

只要在類中存在了,他就會存在于整個生命周期中。?

靜態變量的值對所有類的實例來說是共享的。

四、static內存圖

圖片出自黑馬程序員

注:靜態變量是隨著類的加載而加載的,優先于對象出現。

注:靜態區的變量是共享的?

?

?五、靜態方法和工具類

幾種常見的工具類

javabeen類

Java Bean 類是Java開發中常見的一種模式,它有助于實現數據的封裝和重用,同時也是構建面向對象程序設計中的基礎組件之一。

使用 Java Bean 類的場景:
  • 數據封裝:用于封裝應用程序中的數據,提供簡潔的訪問和修改方式。
  • 數據傳輸:用于傳輸數據,例如在客戶端和服務器之間,或者在不同層之間。
  • 框架兼容性:許多框架(如Spring等)利用 Java Bean 的約定進行依賴注入和配置管理。

?測試類

在Java中,測試類通常用于編寫和運行單元測試,以驗證程序的各個部分是否按預期工作。這些測試類是獨立的Java類,用于測試應用程序中的其他類或方法的功能和行為。

編寫測試類的基本步驟
導入必要的類和方法
  • 根據選擇的測試框架,導入正確的測試注解和斷言方法。通常,需要導入類似于?org.junit.jupiter.api.Test?和?org.junit.jupiter.api.Assertions.*?這樣的類。
編寫測試方法
  • 使用測試框架提供的注解(如?@Test)標記測試方法,以便測試運行器能夠識別它們。
  • 在方法中編寫測試邏輯,通常包括調用待測試的方法或類,并使用斷言來驗證預期的行為或結果是否正確。
運行測試
  • 在集成開發環境(IDE)中,通常可以通過右鍵單擊測試類并選擇“運行測試”來直接運行單元測試。
  • 也可以通過構建工具(如 Maven 或 Gradle)的測試插件來運行測試,或者使用命令行界面運行測試。

工具類?

Java 中的工具類是一種常見的編程實踐,用于封裝一些常用的靜態方法或者提供一些靜態字段,以便在整個應用程序中方便地進行調用和重用。工具類通常不包含狀態,其方法一般是無副作用的,主要用于功能性的操作。

靜態方法

工具類中的方法通常是靜態的,可以直接通過類名調用,無需實例化對象。

私有構造函數

通常會將工具類的構造函數聲明為私有,以防止被實例化。因為工具類主要是為了提供靜態方法,而不是創建對象。

常用的靜態方法

工具類可以包含各種常用的靜態方法,例如字符串處理、日期操作、數學計算等。

無狀態

工具類通常不包含成員變量,也不維護狀態,這樣可以確保其方法的純粹性,避免副作用。

實用性

工具類主要用于封裝一些通用的操作,提高代碼的復用性和可維護性。在大型項目中特別有用,可以減少代碼重復。

?定義數組工具類

代碼實現:?

/*** 將整數數組轉換為字符串表示形式。* 該方法通過StringBuilder構建數組的字符串表示,以避免使用+操作符連接字符串時的性能問題。* 它遍歷數組,并將每個元素添加到StringBuilder中,除了最后一個元素之外,每個元素后面都跟上一個逗號。* 最后,方法返回StringBuilder的字符串形式,該字符串以方括號包圍數組元素。** @param arr 整數數組,要轉換為字符串表示的數組。* @return 字符串表示的數組,格式為"[元素1, 元素2, ..., 元素n]"。*/public static String printArray(int[] arr){// 初始化StringBuilder以構建數組的字符串表示。StringBuilder sb = new StringBuilder();// 開始構建字符串,先添加左方括號。sb.append("[");// 遍歷數組中的每個元素。for (int i = 0; i < arr.length; i++) {// 如果當前元素是最后一個元素,就不添加逗號。if (i == arr.length - 1){sb.append(arr[i]);}else {// 對于其他元素,在其后面添加逗號。sb.append(arr[i]).append(",");}}// 完成構建字符串,添加右方括號。sb.append("]");// 返回構建好的字符串表示的數組。return sb.toString();}
    /*** 計算數組的平均值。* * @param arr2 一個double類型的數組,用于計算平均值。* @return 返回數組所有元素的平均值。*/public static double getAverage(double[] arr2){double sum = 0; // 初始化累加和為0// 遍歷數組,累加數組中的每個元素for (int i = 0; i < arr2.length; i++) {sum += arr2[i];}// 返回累加和除以數組長度得到的平均值return sum / arr2.length;}

?結果展示:

定義學生工具類

?代碼實現:

/*** StudentUtil類是一個工具類,用于學生信息的操作。* 該類被設計為不可實例化,通過提供靜態方法來服務。*/
private StudentUtil(){}/*** 獲取學生列表中最大的年齡。* * @param list 一個ArrayList類型的學生列表,不能為空。* @return 返回學生列表中的最大年齡。* * 注意:該方法假設列表至少有一個學生,沒有進行空列表的檢查。*/
public static int getMaxAge(ArrayList<Student>list){/* 初始化最大年齡為列表第一個學生的年齡 */int maxAge = list.getFirst().getAge();/* 遍歷學生列表,尋找最大年齡 */for (Student student : list) {/* 如果當前學生的年齡大于已知的最大年齡,則更新最大年齡 */if (student.getAge() > maxAge) maxAge = student.getAge();}/* 返回找到的最大年齡 */return maxAge;
}

結果展示:

六、static注意事項和使用場景

靜態字段

靜態字段屬于類而不是實例。這意味著所有實例共享同一個靜態字段的值。應謹慎使用靜態字段,因為它們的狀態是全局的,并可能導致并發訪問問題。

靜態方法

靜態方法可以直接通過類名調用,無需實例化對象。通常用于實現工具類、工廠方法或者在沒有實例化對象時執行某些操作的情況。靜態方法不能訪問非靜態方法或者實例變量,因為它們沒有隱式的?this?引用。

靜態塊

靜態塊用?static { ... }?來聲明,它在類加載時執行,并且僅執行一次。通常用于初始化靜態字段或執行靜態方法。

靜態類

如果類被聲明為?static,那么它通常是一個內部類,表明它不需要外部類的實例即可被實例化。靜態內部類不能直接訪問非靜態的外部類成員。

注意事項

  • 線程安全性:靜態字段和方法是類級別的,可能會影響多個實例或線程。確保在多線程環境下使用時考慮到線程安全性。
  • 單例模式:靜態方法和塊常用于實現單例模式。確保單例的唯一性和線程安全性是使用靜態的重要考慮因素。
  • 依賴注入:靜態方法或字段不適合用于依賴注入,因為它們導致代碼緊耦合,并使得單元測試變得困難。
  • 靜態導入
  • 使用?import static?可以導入靜態方法和字段,使得在使用時可以不通過類名而直接訪問。這在某些情況下可以提高代碼的可讀性,但也要避免濫用,以免降低代碼的可維護性。

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

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

相關文章

P2p網絡性能測度及監測系統模型

P2p網絡性能測度及監測系統模型 網絡IP性能參數 IP包傳輸時延時延變化誤差率丟失率虛假率吞吐量可用性連接性測度單向延遲測度單向分組丟失測度往返延遲測度 OSI中的位置-> 網絡層 用途 面相業務的網絡分布式計算網絡游戲IP軟件電話流媒體分發多媒體通信 業務質量 通過…

運維檢查:mysql表自增id是否快要用完

數據庫表中最大自增ID用完會報錯。判斷是否接近或達到自增ID類型的最大值&#xff1a;? 對于MySQL中的自增ID&#xff0c;?如果使用的是int類型&#xff0c;?其無符號&#xff08;?unsigned&#xff09;?的最大值可以達到2^32 - 1&#xff0c;?即4294967295。?如果使用的…

python編程:從入門到實踐(第三版) 筆記

文章目錄 資源網站:https://www.ituring.com.cn/book/3038配置VSCode推薦資源網站推薦資源網址 資源網站:https://www.ituring.com.cn/book/3038 配置VSCode 推薦資源網站 推薦資源網址 英文版主頁&#xff1a; https://ehmatthes.github.io/pcc_3e 中文版主頁&#xff1a; h…

上市公司企業共同機構所有權數據、機構交叉持股數據(2005-2023)

數據來源&#xff1a;基礎數據來源于上市公司企業年報 時間跨度&#xff1a;2005-2023年 數據范圍&#xff1a;企業層面 數據指標&#xff1a; 參考《中國工業經濟》杜勇&#xff08;2021&#xff09;老師的做法&#xff0c;從 3 個維度構造指標反映上市公司共同機構所有權&…

Vue和Element UI 路由跳轉

在Vue.js中&#xff0c;使用Vue Router可以方便地實現頁面之間的路由跳轉。Element UI是一個基于Vue 2.0的桌面端組件庫&#xff0c;它本身并不直接提供路由跳轉的功能&#xff0c;但你可以在使用Element UI的Vue項目中結合Vue Router來實現這一功能。 以下是一個基于Vue和Ele…

Proxyman for Mac v5.6.1 抓包調試工具

Mac分享吧 文章目錄 效果一、下載軟件二、功能三、開始安裝1、雙擊運行軟件&#xff0c;將其從左側拖入右側文件夾中&#xff0c;等待安裝完畢2、應用程序顯示軟件圖標&#xff0c;表示安裝成功 四、運行測試1、打開軟件 安裝完成&#xff01;&#xff01;&#xff01; 效果 一…

【華為OD筆試】2024D卷命題規律解讀【分析300+場OD筆試考點總結】

可上 歐弟OJ系統 練習華子OD、大廠真題 綠色聊天軟件戳 od1441了解算法沖刺訓練&#xff08;備注【CSDN】否則不通過&#xff09; 文章目錄 相關推薦閱讀華為OD筆試2024D卷命題規律解讀華為OD算法/大廠面試高頻題算法練習沖刺訓練 相關推薦閱讀 【華為OD筆試】2024D卷機考套題…

C# Opencv實現本地以圖搜圖

地址&#xff1a;馮騰飛/本地以圖搜圖

Java面試八股之Redis哨兵機制

Redis哨兵機制 Redis Sentinel&#xff08;哨兵&#xff09;模式是一種高可用解決方案&#xff0c;用于監控和自動故障轉移Redis主從集群。以下是對哨兵模式詳細過程的描述&#xff1a; 1. 初始化與配置 部署哨兵節點&#xff1a;在不同的服務器上部署一個或多個Redis Sentin…

《算法筆記》總結No.7——二分(多例題詳解版)

一.二分查找 目前有一個有序數列&#xff0c;舉個例子&#xff0c;假設是1~1000&#xff0c;讓我們去查找931這個數字&#xff0c;淺顯且暴力的做法就是直接從頭到尾遍歷一遍&#xff0c;直到找到931為止。當n非常大&#xff0c;比如達到100w時&#xff0c;這是一個非常大的量級…

Linux 線程初步解析

1.線程概念 在一個程序里的一個執行路線就叫做線程&#xff08;thread&#xff09;。更準確的定義是&#xff1a;線程是“一個進程內部的控制序列。在linux中&#xff0c;由于線程和進程都具有id,都需要調度等等相似性&#xff0c;因此都可以用PCB來描述和控制,線程含有PCB&am…

美聯儲降息應該更早?高盛:有充分理由7月降息,而非9月

KlipC報道&#xff1a;高盛首席經濟學家哈祖斯Jan Hatzius表示&#xff0c;美聯儲“有充分理由”在7月會議上降息&#xff0c;而非等到9月。 在最新發布的報告中&#xff0c;他表明通脹已經取得了足夠的進展&#xff0c;回到了美聯儲2%的長期目標附近&#xff0c;這將使美聯儲…

[C++ 入門基礎 - 命名空間]

在C中&#xff0c;命名空間&#xff08;Namespace&#xff09;是一種用來組織代碼并避免命名沖突的機制。命名空間可以包含變量、函數、類等C中的所有實體&#xff0c;使得這些實體的名稱在命名空間內部有效&#xff0c;避免了與其他命名空間或全局作用域中相同名稱的沖突。 文…

實現將Nginx的每個網站配置單獨的訪問日志

一、問題描述 Nginx默認的訪問日志是不會區分哪個網站有哪些日志的,全部糅雜在一起;如果需要哪個網站有哪些訪問日志記錄,還需要將訪問日志下載下來后篩選,比較麻煩;希望將每個網站對應的日志能夠單獨記錄到對應的日志文件里面,方便排查和管理。 # 進入Nginx默認的日志文…

為什么Vim是程序員最喜歡的編輯器之一

簡介 Vim&#xff0c;全稱Vi IMproved&#xff0c;是一種高度可定制、功能強大的文本編輯器。自其誕生以來&#xff0c;它以高效、快速和靈活的特點深受程序員喜愛。無論是處理簡單的文本文件還是復雜的代碼項目&#xff0c;Vim都能提供卓越的編輯體驗。許多資深程序員甚至稱其…

c++ primer plus 第16章string 類和標準模板庫,6.1.5字符串種類

c primer plus 第16章string 類和標準模板庫,6.1.5字符串種類 c primer plus 第16章string 類和標準模板庫,6.1.5字符串種類 文章目錄 c primer plus 第16章string 類和標準模板庫,6.1.5字符串種類6.1.5字符串種類 6.1.5字符串種類 本節將 string 類看作是基于 char 類型的。…

web服務器經過代理后的絕對路徑問題,以及 dirname(__FILE__)和__DIR__

web服務器經過代理后的絕對路徑問題&#xff0c;以及 dirname&#xff08;__FILE__&#xff09;和__DIR__ 問題描述情況解析資源路徑分析訪問過程分析 dirname(\_\_FILE\_\_) 與 \_\_DIR\_\_ 同步發布在個人筆記web服務器經過代理后的絕對路徑問題&#xff0c;以及 dirname(__F…

Nest.js 實戰 (一):使用過濾器優雅地統一處理響應體

前言 在我們實際的業務開發中&#xff0c;我們可以看到后端接口返回格式都有一定的要求&#xff0c;假如我們統一規定接口的統一返回格式為&#xff1a; {data: any; // 業務數據code: number; // 狀態碼msg: string; // 響應信息timestamp: number; // 時間戳 }那么在 Nest.…

【智能算法改進】改進的麻雀搜索算法及其求解旅行商問題

目錄 1.算法原理2.改進點3.結果展示4.參考文獻5.代碼獲取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及實現 2.改進點 改進發現者更新位置 為了使 SSA 算法能夠避開向原點收斂的弊端, 將算法向最優位置跳躍的操作轉換為向最優位置的移動: X i ,…

自己動手寫一個滑動驗證碼組件(后端為Spring Boot項目)

近期參加的項目&#xff0c;主管丟給我一個任務&#xff0c;說要支持滑動驗證碼。我身為50歲的軟件攻城師&#xff0c;當時正背著雙手&#xff0c;好像一個受訓的保安似的&#xff0c;中規中矩地參加每日站會&#xff0c;心想滑動驗證碼在今時今日已經是標配了&#xff0c;司空…