Java中static關鍵字的作用與使用詳解

static是Java中一個非常重要的關鍵字,它可以用來修飾變量、方法、代碼塊和嵌套類。下面將從多個方面詳細解釋static的作用和使用方法。

一、static變量(類變量)

  1. 作用
    • static變量屬于類,而不是類的某個實例。所有實例共享同一個static變量。
  2. 示例
    • 示例1:靜態變量計數
public class Counter {static int count = 0;  // 靜態變量Counter() {count++;  // 每次創建對象時count加1System.out.println("當前計數: " + count);}public static void main(String[] args) {Counter c1 = new Counter();  // 輸出: 當前計數: 1Counter c2 = new Counter();  // 輸出: 當前計數: 2Counter c3 = new Counter();  // 輸出: 當前計數: 3// 可以直接通過類名訪問靜態變量System.out.println("總計數: " + Counter.count);  // 輸出: 總計數: 3}
}
  • 示例2:共享配置
public class AppConfig {public static final String APP_NAME = "MyApplication";public static final double VERSION = 1.0;public static void displayConfig() {System.out.println("應用名稱: " + APP_NAME);System.out.println("版本號: " + VERSION);}
}public class Main {public static void main(String[] args) {// 直接通過類名訪問靜態變量和方法System.out.println(AppConfig.APP_NAME);  // 輸出: MyApplicationAppConfig.displayConfig();}
}

二、static方法(類方法)

  1. 作用
    • static方法屬于類,而不是類的實例。可以直接通過類名調用,無需創建對象。
  2. 示例
    • 示例1:工具方法
public class MathUtils {public static int add(int a, int b) {return a + b;}public static double calculateCircleArea(double radius) {return Math.PI * radius * radius;}
}public class Main {public static void main(String[] args) {int sum = MathUtils.add(5, 3);  // 直接通過類名調用System.out.println("5 + 3 = " + sum);double area = MathUtils.calculateCircleArea(2.5);System.out.println("半徑為2.5的圓面積: " + area);}
}
  • 示例2:工廠方法
public class DateHelper {public static Date getCurrentDate() {return new Date();}public static Date createDate(int year, int month, int day) {Calendar cal = Calendar.getInstance();cal.set(year, month - 1, day);return cal.getTime();}
}public class Main {public static void main(String[] args) {Date today = DateHelper.getCurrentDate();System.out.println("今天是: " + today);Date birthday = DateHelper.createDate(1990, 5, 15);System.out.println("生日是: " + birthday);}
}

三、static代碼塊

  1. 作用
    • 用于初始化靜態變量,在類加載時執行,且只執行一次。
  2. 示例
public class DatabaseConnection {private static Connection connection;// 靜態代碼塊,在類加載時執行static {try {// 加載數據庫驅動Class.forName("com.mysql.jdbc.Driver");// 創建數據庫連接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");System.out.println("數據庫連接已建立");} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() {return connection;}
}public class Main {public static void main(String[] args) {// 第一次使用DatabaseConnection時會觸發靜態代碼塊執行Connection conn = DatabaseConnection.getConnection();// 使用連接...}
}

四、static嵌套類

  1. 作用
    • static可以修飾嵌套類,表示這個嵌套類不依賴于外部類的實例。
  2. 示例
public class OuterClass {private static String outerStaticField = "外部類靜態字段";private String outerInstanceField = "外部類實例字段";// 靜態嵌套類public static class StaticNestedClass {public void display() {System.out.println("訪問外部類靜態字段: " + outerStaticField);// 下面這行會編譯錯誤,靜態嵌套類不能訪問外部類的非靜態成員// System.out.println(outerInstanceField);}}// 非靜態內部類public class InnerClass {public void display() {System.out.println("訪問外部類靜態字段: " + outerStaticField);System.out.println("訪問外部類實例字段: " + outerInstanceField);}}
}public class Main {public static void main(String[] args) {// 創建靜態嵌套類實例,不需要外部類實例OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();nested.display();// 創建非靜態內部類實例需要外部類實例OuterClass outer = new OuterClass();OuterClass.InnerClass inner = outer.new InnerClass();inner.display();}
}

五、static導入

  1. 作用
    • 可以直接導入靜態成員,使用時無需指定類名。
  2. 示例
import static java.lang.Math.PI;
import static java.lang.Math.pow;
import static java.lang.System.out;public class StaticImportExample {public static void main(String[] args) {// 使用靜態導入后,可以直接使用PI和pow,無需Math.PI和Math.powdouble area = PI * pow(5, 2);out.println("面積: " + area);  // 直接使用out代替System.out}
}

六、static使用注意事項

  1. 靜態方法限制
    • 靜態方法只能直接調用其他靜態方法。
    • 靜態方法只能直接訪問靜態變量。
    • 靜態方法不能使用thissuper關鍵字。
  2. 靜態變量生命周期
    • 靜態變量在類加載時初始化,程序結束時銷毀。
    • 靜態變量存儲在方法區(Method Area)。
  3. 何時使用static
    • 當變量或方法與類相關,而不是與實例相關時。
    • 需要共享數據或功能時。
    • 工具類方法通常聲明為static
  4. 避免濫用static
    • 過多使用static會導致代碼難以測試和維護。
    • 靜態變量可能導致線程安全問題。

通過以上示例和解釋,應該對Java中static關鍵字的作用和使用方法有了全面的了解。合理使用static可以提高代碼的效率和可讀性,但也要注意不要濫用。

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

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

相關文章

HMLDM-UD100A 型工業激光測距儀通過modbusRTU 轉 profinet 網關輕松接入到西門子1200plc

HMLDM-UD100A 型工業激光測距儀通過modbusRTU 轉 profinet 網關輕松接入到西門子1200plc 在現代工業生產與自動化控制領域,精準的測量設備與高效的通信技術至關重要。HMLDM-UD100A 型工業激光測距儀憑借其高精度、穩定性強等優勢,廣泛應用于各類工業場景…

數據結構與算法:圖論——深度優先搜索dfs

深度優先搜索dfs 提到深度優先搜索(dfs),就不得不說和廣度優先搜索(bfs)有什么區別 根據搜索方式的不同,可以將圖的遍歷分為「深度優先搜索」和「廣度優先搜索」。 深度優先搜索:從某一頂點出…

數組題解——?合并區間【LeetCode】

56. 合并區間 排序: 將所有區間按起始位置 start 從小到大排序。這樣,重疊的區間會相鄰排列,方便后續合并。 合并: 初始化一個空列表 merged,用于存儲合并后的區間。遍歷排序后的區間列表: 如果 merged 為…

關于高精度和鏈表的詳細講解(從屬于GESP五級)

本章內容 高精度 鏈表 位數再多,只管穩穩進位,終會把答案寫滿。 一、高精度 1. 什么是高精度 ? 定義 “高精度整數”指不受 C 原生整型 (int / long long) 位寬限制,而用數組模擬任意位數的大整數。 ? 必要性 64 位 long long 僅能…

Python自動化框架選型指南:Selenium/Airflow/Celery該選誰?

在Python自動化領域,Selenium、Airflow和Celery是三個高頻出現的工具,但它們的定位和適用場景截然不同。許多開發者在技術選型時容易混淆它們的邊界,導致項目架構臃腫或功能不匹配。本文將通過對比分析,幫你明確不同場景下的最佳選擇。 一、框架定位與核心功能對比 框架核…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | DrinkWater(喝水記錄組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— DrinkWater組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> 語法結…

UAVAI-YOLO:無人機航拍圖像的小目標檢測模型

摘要 針對無人機航拍圖像目標檢測效果差的問題&#xff0c;提出改進的UAVAI-YOLO模型。首先&#xff0c;為使模型獲得更加豐富的語義信息&#xff0c;使用改進可變形卷積網絡&#xff08;deformable convolutional networks&#xff0c;DCN&#xff09;替換原骨干&#xff08…

Solidity 入門教程(一):Hello Web3,從一個字符串開始!

學習 Solidity 最好的方式&#xff0c;就是寫出你的第一個合約&#xff01;在本篇文章中&#xff0c;我們將用極簡的代碼&#xff0c;通過 Remix 平臺快速實現并運行一個 “Hello Web3!” 合約&#xff0c;正式邁入智能合約開發的大門。 一、什么是 Solidity&#xff1f; Sol…

串擾與包地

串擾與包地&#xff1a; 串擾與包地一直是業界非常關心的一個問題&#xff0c;圍繞著它們的爭論非常多&#xff0c;那到底是包地好 還是不包地好呢?高速先生嘗試著從理論和實際測試上來給大家做一個分析。 為了驗證它&#xff0c;高速先生做了以下幾種情況&#xff0c;如圖5-…

leetcode hot 100之:二叉樹的最近公共祖先

本來不打算寫的哈哈哈但是發現這一道遞歸我是有思路的&#xff01;&#xff01;自己能想到一些方向&#xff01;我真棒&#xff01;所以記錄一下哈哈哈 我的思路&#xff1a; 1、祖先一定是自身或往上找&#xff0c;所以如何逆著走呢&#xff1f; 2、3種情況&#xff1a; 有…

【VUE】某時間某空間占用情況效果展示,vue2+element ui實現。場景:會議室占用、教室占用等。

某時間某空間占用情況效果展示&#xff0c;vue2element ui實現。場景&#xff1a;會議室占用、教室占用等。 場景說明&#xff1a; 現在需要基于vue2和el-table實現每日會議室個時間點占用情況。 已知數據&#xff1a; 1、會議室數據&#xff08;名稱&#xff0c;id&#xff…

Git更換源方式記錄

本文首發地址&#xff1a;https://www.dawnsite.cn/archives/198.html 該方式前提是本地項目已關聯遠程倉庫&#xff0c;由于業務變更git地址改變 1. 移除本地已有遠程倉庫 git remote remove origin2. 添加新的遠程倉庫源 git remote add origin "clone地址"3.一步…

前端面試專欄-主流框架:12. Vue3響應式原理與API

&#x1f525; 歡迎來到前端面試通關指南專欄&#xff01;從js精講到框架到實戰&#xff0c;漸進系統化學習&#xff0c;堅持解鎖新技能&#xff0c;祝你輕松拿下心儀offer。 前端面試通關指南專欄主頁 前端面試專欄規劃詳情 Vue3響應式原理與API詳解 一、引言 Vue3作為Vue.j…

DAY 37 早停策略和模型權重的保存

早停策略 import torch.nn as nn import torch.optim as optim import time import matplotlib.pyplot as plt from tqdm import tqdm# Define the MLP model class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 nn.Linear(X_train.shape[1], 10)s…

零基礎搭建Spring AI本地開發環境指南

Spring AI 是一個 Spring 官方團隊主導的開源項目&#xff0c;旨在將生成式人工智能&#xff08;Generative AI&#xff09;能力無縫集成到 Spring 應用程序中。它提供了一個統一的、Spring 風格的抽象層&#xff0c;簡化了與各種大型語言模型&#xff08;LLMs&#xff09;、嵌…

windows登錄系統配置雙因子認證的解決方案

在數字化浪潮席卷全球的今天&#xff0c;安全如同氧氣般不可或缺。Verizon《2023年數據泄露調查報告》指出&#xff0c;80%的黑客攻擊與登錄憑證失竊直接相關。當傳統密碼防護變得千瘡百孔&#xff0c;企業如何在身份驗證的戰場上贏得主動權&#xff1f;答案就藏在"雙保險…

Java數據結構——線性表Ⅱ

一、鏈式存儲結構概述 1. 基本概念&#xff08;邏輯分析&#xff09; 核心思想&#xff1a;用指針將離散的存儲單元串聯成邏輯上連續的線性表 設計動機&#xff1a;解決順序表 "預先分配空間" 與 "動態擴展" 的矛盾 關鍵特性&#xff1a; 結點空間動態…

技術基石:SpreadJS 引擎賦能極致體驗

在能源行業數字化轉型的浪潮中&#xff0c;青島國瑞信息技術有限公司始終以技術創新為核心驅動力&#xff0c;不斷探索前沿技術在能源領域的深度應用。其推出的 RCV 行列視生產數據應用系統之所以能夠在行業內脫穎而出&#xff0c;離不開背后強大的技術基石 ——SpreadJS 引擎。…

Typora - Typora 打字機模式

Typora 打字機模式 1、基本介紹 Typora 打字機模式&#xff08;Typewriter Mode&#xff09;是一種專注于當前寫作行的功能 打字機模式會自動將正在編輯的行保持在屏幕中央&#xff0c;讓用戶更集中注意力&#xff0c;類似于傳統打字機的體驗 2、開啟方式 點擊 【視圖】 -…

3.0 compose學習:MVVM框架+Hilt注解調用登錄接口

文章目錄 前言&#xff1a;1、添加依賴1.1 在settings.gradle.kts中添加1.2 在應用級的build.gradle.kts添加插件依賴1.3 在module級的build.gradle.kts添加依賴 2、實體類2.1 request2.2 reponse 3、網絡請求3.1 ApiService3.2 NetworkModule3.3 攔截器 添加token3.4 Hilt 的 …