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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 的 …