当前位置: 首页 > news >正文

Java面试要点06 - static关键字、静态属性与静态方法

在这里插入图片描述

本文目录

    • 一、引言
    • 二、静态属性(Static Fields)
    • 三、静态方法(Static Methods)
    • 四、静态代码块(Static Blocks)
    • 五、静态内部类(Static Nested Classes)
    • 六、静态导入(Static Import)
    • 七、最佳实践与注意事项
    • 八、总结


一、引言

在Java中,static关键字用于声明属于类层面的成员,而不是实例层面的成员。static成员在类加载时就会被初始化,并且被该类的所有实例所共享。深入理解static关键字的使用对于编写高效的Java代码和设计良好的类结构至关重要。本文将详细探讨static关键字在不同场景下的使用方法和注意事项。

二、静态属性(Static Fields)

静态属性属于类而不是实例,所有实例共享同一个静态属性。这使得静态属性成为实现计数器、缓存和常量等功能的理想选择。

public class StaticFieldExample {// 静态常量public static final String COMPANY_NAME = "TechCorp";// 静态变量作为计数器private static int instanceCount = 0;// 实例变量private String name;// 静态变量用于缓存private static final Map<String, StaticFieldExample> cache = new HashMap<>();public StaticFieldExample(String name) {this.name = name;instanceCount++;  // 记录实例创建次数}// 获取创建的实例数量public static int getInstanceCount() {return instanceCount;}// 使用缓存的工厂方法public static StaticFieldExample getInstance(String name) {return cache.computeIfAbsent(name, StaticFieldExample::new);}// 演示静态属性的共享特性public static void main(String[] args) {System.out.println("初始实例数: " + getInstanceCount());StaticFieldExample obj1 = new StaticFieldExample("Instance 1");System.out.println("创建第一个实例后: " + getInstanceCount());StaticFieldExample obj2 = new StaticFieldExample("Instance 2");System.out.println("创建第二个实例后: " + getInstanceCount());}
}

三、静态方法(Static Methods)

静态方法不需要创建类的实例就可以调用,它们通常用于实现工具方法或工厂方法。静态方法不能访问非静态成员,因为它们不属于任何实例。

public class StaticMethodExample {private int instanceValue;private static int staticValue = 0;// 静态工具方法public static int calculateSum(int[] numbers) {int sum = 0;for (int number : numbers) {sum += number;}return sum;}// 静态工厂方法public static StaticMethodExample createInstance() {StaticMethodExample instance = new StaticMethodExample();instance.instanceValue = ++staticValue;return instance;}// 错误示例:静态方法不能访问非静态成员/*public static void incorrectMethod() {System.out.println(instanceValue); // 编译错误}*/// 正确示例:静态方法访问静态成员public static void correctMethod() {System.out.println(staticValue);}// 实例方法可以访问静态成员public void instanceMethod() {System.out.println("Static value: " + staticValue);System.out.println("Instance value: " + instanceValue);}
}// 静态方法的使用示例
class StaticMethodDemo {public static void main(String[] args) {// 直接通过类名调用静态方法int[] numbers = {1, 2, 3, 4, 5};int sum = StaticMethodExample.calculateSum(numbers);System.out.println("Sum: " + sum);// 使用静态工厂方法创建实例StaticMethodExample instance1 = StaticMethodExample.createInstance();StaticMethodExample instance2 = StaticMethodExample.createInstance();}
}

四、静态代码块(Static Blocks)

静态代码块用于类的初始化,它在类加载时执行,且只执行一次。这使得它成为初始化静态资源的理想场所。

public class StaticBlockExample {private static Map<String, String> configMap;// 静态代码块static {System.out.println("静态代码块执行");configMap = new HashMap<>();loadConfig();}// 第二个静态代码块(按声明顺序执行)static {System.out.println("第二个静态代码块执行");configMap.put("version", "1.0");}private static void loadConfig() {configMap.put("name", "MyApp");configMap.put("author", "Developer");}// 获取配置值public static String getConfig(String key) {return configMap.get(key);}public static void main(String[] args) {System.out.println("应用名称: " + getConfig("name"));System.out.println("版本: " + getConfig("version"));}
}

五、静态内部类(Static Nested Classes)

静态内部类是一种特殊的嵌套类,它不持有外部类的引用,可以独立于外部类的实例而存在。

public class StaticNestedClassExample {private static String outerStaticField = "Outer Static";private String outerInstanceField = "Outer Instance";// 静态内部类public static class StaticInner {private String innerField;public StaticInner(String value) {this.innerField = value;}public void printInfo() {// 可以访问外部类的静态成员System.out.println("Outer static field: " + outerStaticField);// 不能直接访问外部类的实例成员// System.out.println(outerInstanceField); // 编译错误}}// 内部类的使用示例public static void main(String[] args) {// 创建静态内部类实例不需要外部类实例StaticInner inner = new StaticInner("Inner Value");inner.printInfo();}
}

六、静态导入(Static Import)

静态导入允许我们直接使用静态成员,而不需要类名限定。虽然方便,但过度使用可能导致代码可读性降低。

import static java.lang.Math.PI;
import static java.lang.Math.max;
import static java.lang.System.out;public class StaticImportExample {public static void main(String[] args) {// 使用静态导入的成员out.println("PI value: " + PI);out.println("Max of 10 and 20: " + max(10, 20));// 不使用静态导入的写法System.out.println("Regular import: " + Math.PI);}
}

七、最佳实践与注意事项

在使用static关键字时,需要注意一些重要的最佳实践和潜在问题:

  1. 静态成员的内存考虑:
public class StaticMemoryExample {// 注意:静态成员会一直占用内存private static final List<String> cache = new ArrayList<>();// 建议提供清理方法public static void clearCache() {cache.clear();}
}
  1. 线程安全考虑:
public class StaticThreadSafetyExample {// 静态成员在多线程环境下需要同步private static int counter = 0;// 线程安全的计数方法public static synchronized void incrementCounter() {counter++;}// 使用原子类型保证线程安全private static final AtomicInteger atomicCounter = new AtomicInteger(0);public static void safeIncrement() {atomicCounter.incrementAndGet();}
}

八、总结

static关键字是Java语言中一个强大的特性,它使我们能够创建类级别的成员,实现工具方法,并优化内存使用。通过合理使用static关键字,我们可以实现更好的代码组织和更高的性能。然而,在使用static时需要谨慎考虑内存管理和线程安全等问题,确保在正确的场景下使用这个关键字。

今天的内容就到这里了,希望可以对你有帮助。

相关文章:

Java面试要点06 - static关键字、静态属性与静态方法

本文目录 一、引言二、静态属性&#xff08;Static Fields&#xff09;三、静态方法&#xff08;Static Methods&#xff09;四、静态代码块&#xff08;Static Blocks&#xff09;五、静态内部类&#xff08;Static Nested Classes&#xff09;六、静态导入&#xff08;Static…...

动态规划-背包问题——416.分割等和子集

1.题目解析 题目来源 416.分割等和子集——力扣 测试用例 2.算法原理 1.状态表示 这里背包问题基本上和母题的思路大相径庭&#xff0c;母题请见 [模板]01.背包 &#xff0c;这里的状态表示与装满背包的情况类似&#xff0c;第二个下标就是当选择的物品体积直接等于j时是否可…...

Pr:视频过渡快速参考(合集 · 2025版)

Adobe Premiere Pro 自带七组约四十多个视频过渡 Video Transitions效果&#xff0c;包含不同风格和用途&#xff0c;可在两个剪辑之间创造平滑、自然的转场&#xff0c;用来丰富时间、地点或情绪的变化。恰当地应用过渡可让观众更好地理解故事或人物。 提示&#xff1a; 点击下…...

网络安全---安全见闻2

网络安全—安全见闻 拓宽视野不仅能够丰富我们的知识体系&#xff0c;也是自我提升和深造学习的重要途径&#xff01;&#xff01;&#xff01; 设备漏洞问题 操作系统漏洞 渗透测试视角&#xff1a;硬件设备上的操作系统可能存在各种漏洞&#xff0c;攻击者可以利用这些漏洞…...

解决因为TortoiseSVN未安装cmmand line client tools组件,导致idea无法使用svn更新、提交代码

一.错误信息 1.更新代码时&#xff1a;SVN: 更新错误 找不到要更新的版本管理目录。 2.提交代码&#xff1a;检测不到任何更新&#xff08;实际上有代码修改&#xff09;。 3.Cannot run program "svn"。 二.原因分析 在电脑上新安装的的客户端TortoiseSVN、ide…...

Ubuntu 20.04安装CUDA 11.0、cuDNN 8.0.5

不知道咋弄的ubuntu20.04电脑的cuda驱动丢了&#xff0c;无奈需装PyTorch环境&#xff0c;只有CUDA11.0以上版本才支持Ubuntu20.04&#xff0c;所以安装了CUDA11.0、cuDNN8.0.5 为防止频繁在浏览器检索对应的贴子&#xff0c;今天记录一下。 一. 驱动安装 为防止驱动安装后没…...

鸿蒙 APP 发布上架

证书创建与打包: https://developer.huawei.com/consumer/cn/doc/app/agc-help-releaseharmony-0000001933963166 不同环境多渠道打包: //todo 备案相关 一、除了发布应用商店以外,还有3个渠道,都适合小规模内测。 【1】开放式测试:发给指定白名单用户 【2】发布企业内…...

【C++笔记】C++三大特性之继承

【C笔记】C三大特性之继承 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】C三大特性之继承前言一.继承的概念及定义1.1 继承的概念1.2继承的定义1.3继承基类成员访问方式的变化1.4继承类模板 二.基类和派生类间的转…...

如何在CentOS 7上搭建SMB服务

如何在CentOS 7上搭建SMB服务 因项目测试需求&#xff0c;需要自行搭建SMB服务&#xff0c;**SMB&#xff08;Server Message Block&#xff09;**协议是一种常用的文件共享方式&#xff0c;它可以让不同操作系统之间共享文件、打印机等资源。本文将带你一步步搭建一个简单的S…...

linux详解,基本网络枚举

基本网络枚举 一、基本网络工具 ifconfig ifconfig是一个用于配置和显示网络接口信息的命令行工具。它可以显示网络接口的P地址、子网掩码、MC地址等信息&#xff0c;还可以用于启动、停止或配置网络接口。 ip ip也是用于查看和管理网络接口的命令。 它提供了比ifconfig更…...

5G智能对讲终端|北斗有源终端|北斗手持机|单兵|单北斗

在当今这个快速发展的数字化时代&#xff0c;5G技术的广泛应用正以前所未有的速度推动着各行各业的变革。作为这一技术浪潮中的重要一环&#xff0c;5G智能终端QM630D凭借其卓越的性能和多样化的功能&#xff0c;在林业、渔业、安保、电力、交通等多个领域展现出了巨大的应用潜…...

第七部分:2. STM32之ADC实验--AD多通道(AD采集三路传感器模块实验:光敏传感器、热敏传感器、反射式传感器附赠温湿度传感器教程)

这个多通道采用非扫描模式--单次转换模式 1.代码配置链路图 2. ADC的输入通道 3.ADC的非扫描模式的转换模式&#xff08;单次和连续&#xff09; 4.ADC的扫描模式的转换模式&#xff08;单次和连续&#xff09; 5.采集校准 代码实验&#xff1a; 代码部分&#xff1a; #inclu…...

js.零钱兑换

链接&#xff1a;322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何…...

GitHub 上的开源项目推荐

GitHub 上的开源项目有成千上万&#xff0c;涵盖了从前端框架到数据科学、机器学习、系统工具等各个领域。不同的人根据兴趣和需求&#xff0c;可能会有不同的排名。不过&#xff0c;一些开源项目因为其广泛的应用、社区支持和技术创新&#xff0c;通常被认为是“最好”的开源项…...

实现Reactor反应堆模型:框架搭建

实现Reactor反应堆模型&#xff1a;框架搭建 Reactor模型是一种常用于处理大量并发I/O操作的设计模式&#xff0c;特别适用于服务器端的网络编程。该模型通过事件驱动的方式&#xff0c;将I/O操作的处理与具体的业务逻辑分离&#xff0c;从而提高系统的并发处理能力和响应速度…...

UE5 样条线组件(未完待续)

按点生成模型 按距离生成 spline mesh 可缩放spline mesh...

计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议

文章目录 一、TCP/IP五层模型&#xff08;重要&#xff09;二、应用层常见的协议三、TCP与UDP3.1 TCP、UDP的区别&#xff08;重要&#xff09;3.2 运行于TCP、UDP上的协议3.3 TCP的三次握手、四次挥手3.3.1 TCP的三次握手3.3.2 TCP的四次挥手3.3.3 随机生成序列号的原因 四、T…...

sql速度优化多条合并为一条语句

在 SQL 中&#xff0c;结合 CASE 和 SUM 可以实现根据特定条件进行分组求和。在 ThinkPHP 中也可以使用类似的方式进行数据库查询操作。 例如&#xff0c;假设有一个销售数据表&#xff0c;包含字段 product_id &#xff08;产品 ID&#xff09;、 quantity &#xff08;销…...

用 PHP或Python加密字符串,用iOS解密

可以使用对称加密算法&#xff08;如 AES&#xff09;来加密和解密字符串。对称加密适合这种跨平台加密解密的需求&#xff0c;因为可以使用相同的密钥和算法在不同的编程语言和系统之间进行加密和解密。 下面展示如何使用 Python 或 PHP 进行加密&#xff0c;然后用 iOS (Swi…...

docker容器启动报错error creating overlay mount to /var/lib/docker/overlay2解决办法

背景&#xff1a;客户提供的机器用于部署服务&#xff0c;拿到发现docker是部署好的&#xff0c;但是selinux没有关闭&#xff0c;于是将/etc/selinux/config中的selinux设置成了disabled&#xff0c;但是并未重启&#xff0c;就继续部署服务了&#xff1b;结果几天后客户重启服…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...