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.rhkb.cn/news/377990.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS上微信小程序密码框光标离开提示存储密码解决方案

问题&#xff1a; ios密码框输入密码光标离开之后会提示存储密码的弹窗 解决方案 1、在苹果手机上面把 “自动填充密码”关闭&#xff0c;但是苹果这个默认开启&#xff0c;而且大部分客户也不会去自己关闭。 2、欺骗苹果手机&#xff0c;代码实现。 先说解决思路&#xf…

玩转HarmonyOS NEXT之IM应用首页布局

本文从目前流行的垂类市场中&#xff0c;选择即时通讯应用作为典型案例详细介绍HarmonyOS NEXT的各类布局在实际开发中的综合应用。即时通讯应用的核心功能为用户交互&#xff0c;主要包含对话聊天、通讯录&#xff0c;社交圈等交互功能。 应用首页 创建一个包含一列的栅格布…

[图解]SysML和EA建模住宅安全系统-14-黑盒系统规约

1 00:00:02,320 --> 00:00:07,610 接下来&#xff0c;我们看下一步指定黑盒系统需求 2 00:00:08,790 --> 00:00:10,490 就是说&#xff0c;把这个系统 3 00:00:11,880 --> 00:00:15,810 我们的目标系统&#xff0c;ESS&#xff0c;看成黑盒 4 00:00:18,030 --> …

Home Assistant在windows环境安装

Home Assistant是什么&#xff1f; Home Assistant 是一个开源的智能家居平台&#xff0c;旨在通过集成各种智能设备和服务&#xff0c;提供一个统一的、可自定义的家庭自动化解决方案。它可以允许用户监控、控制和自动化家中的各种设备&#xff0c;包括灯光、温度、安全系统、…

公司想无偿裁员,同事赖着不走

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这招好像也不错! 事情是这样的&#xff1a;某公司准备把成本高的员工都裁掉&#xff0c;主要包含研发部和程序员&#xff0c;总共18个人&#xff0c;准备裁掉10人&#xff0c;因为他们工资开的太高了&#xff0c;…

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器&#xff0c;它是用来监测硬件或软件的故障的&#xff1b;它的工作原理大概就是开启后内部定时器会按照设置的频率更新&#xff0c;在程序运行过程中我们需不断地重装载看门狗&#xff0c;以使它不溢出&#xff1b;如果硬件或软件发生…

基于pytesseract的OCR图片识别

简介 pytesseract是基于谷歌的tesseract的OCR包&#xff0c;支持识别一些简单的数字、字母、中文。 安装 安装引擎 下载地址&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 一般是Windows 64位系统最新版&#xff1a; 如果要识别中文&#xff0c;注意选中中文…

python每日一题:回文数

题干 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。例如&#xff0c;121 是回文&#xff0…

02:项目二:感应开关盖垃圾桶

感应开关盖垃圾桶 1、PWM开发SG901.1、怎样通过C51单片机输出PWM波&#xff1f;1.2、通过定时器输出PWM波来控制SG90 2、超声波测距模块的使用3、感应开关盖垃圾桶 需要材料&#xff1a; 1、SG90舵机模块 2、HC-SR04超声波模块 3、震动传感器 4、蜂鸣器 5、若干杜邦线 1、PWM开…

LLM-阿里 DashVector + langchain self-querying retriever 优化 RAG 实践【Query 优化】

文章目录 前言self querying 简介代码实现总结 前言 现在比较流行的 RAG 检索就是通过大模型 embedding 算法将数据嵌入向量数据库中&#xff0c;然后在将用户的查询向量化&#xff0c;从向量数据库中召回相似性数据&#xff0c;构造成 context template, 放到 LLM 中进行查询…

【香橙派AiPro】基于VGG16的火灾检测模型预测

目录 引言开发板介绍开发板使用准备工作工具文档 拨码开关镜像烧录连接开发板下载MobaXterm网线-SSH连接开发板设置WIFI连接WIFI-SSH连接开发板确定开发板IP方法 Vnc可视化WindowsiPad 开发工具安装 散热风扇基于VGG16的火灾检测模型预测数据集准备目录结构代码操作 安装宝塔最…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者&#xff0c;Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

【Neural signal processing and analysis zero to hero】- 1

The basics of neural signal processing course from youtube: 传送地址 Possible preprocessing steps Signal artifacts (not) to worry about doing visual based artifact rejection so that means that before you start analyzing, you can identify those data epic…

有关电力电子技术的一些相关仿真和分析:⑤交-直-交全桥逆变+全波整流结构电路(MATLAB/Siumlink仿真)

全桥逆变+全波整流结构 参数:Vin=500V, Vo=200V, T=2:1:1, RL=10Ω, fs=100kHz, L=1mH, C=100uF (1)给定输入电压,输出电压和主电路参数,仿真研究电路工作原理,分析工作时序; (2)调节负载电阻,实现电流连续和断续,并仿真验证; (3)调节占空比,分析占空比与电…

微软Edge浏览器深度解析:性能、安全性与特色功能全面评测

一、引言 自Windows 10操作系统推出以来&#xff0c;微软Edge浏览器作为默认的网页浏览器&#xff0c;凭借其现代化的设计和出色的性能表现&#xff0c;逐渐获得了用户的认可。本文旨在对Edge浏览器进行深入分析&#xff0c;探讨其在多个方面的表现。 二、界面与操作体验 界面…

初识STM32:芯片基本信息

STM32简介 STM32是ST公司基于ARM公司的Cortex-M内核开发的32位微控制器。 ARM公司是全球领先的半导体知识产权&#xff08;IP&#xff09;提供商&#xff0c;全世界超过95%的智能手机和平板电脑都采用ARM架构。 ST公司于1987年由意大利的SGS微电子与法国的Thomson半导体合并…

多样化数据可视化方法的全面示例:基于Python的多样化数据可视化

文章目录 前言代码效果展示 前言 本文演示了使用Python进行温度数据的多样化可视化方法。通过导入、处理和分析气象数据&#xff0c;我们生成了多种图表&#xff0c;包括直方图、核密度估计图、箱型图、小提琴图、条形图、山脊图、经验累积分布函数图和折线图。这些图表帮助我…

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足以下三种 一致性&#xff08;C:consistency&#xff09;可用性&#xff08;A:Available&#xff09;分区容错性&#xff08;P:Partition Tolerance&#xff09; 这三个基本要求&#xff0c;最多只能同时满足…

【Pytorch】数据集的加载和处理(一)

Pytorch torchvision 包提供了很多常用数据集 数据按照用途一般分为三组&#xff1a;训练&#xff08;train&#xff09;、验证&#xff08;validation&#xff09;和测试&#xff08;test&#xff09;。使用训练数据集来训练模型&#xff0c;使用验证数据集跟踪模型在训练期间…

c++包管理器

conan conan search&#xff0c;查看网络库 conan profile detect&#xff0c;生成缓存信息conan new cmake_exe/cmake_lib&#xff0c;创建cmakelists.txtconan install .&#xff0c;执行Conanfile.txt中的配置&#xff0c;生成相关的bat文件 项目中配置Conanfile.txt(或者…