java面向对象进阶篇--static

news2024/9/23 3:11:12

一、前言

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.coloradmin.cn/o/1930066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐5个实用的可视化工具

面对海量的数据&#xff0c;我们应该如何高效地提取其价值&#xff0c;让复杂的信息一目了然&#xff1f;这正是可视化工具大显身手的舞台。今天&#xff0c;我就来分享几款非常好用的数据可视化工具&#xff0c;它们不仅能够帮助你轻松驾驭数据&#xff0c;还能让你的工作汇报…

vite配置环境变量和使用,配置正确后import.meta.env.VITE_APP_BASE_URL编译报错的解决方法

一、配置&#xff1a; 1.新增四个环境文件 .env.development .env.test .env.production .env.pre 内容为不同环境的不同参数变量必须以VITE_APP开头&#xff0c;如&#xff1a; #接口地址 VITE_APP_BASE_URL"&#xffe5;&#xffe5;&#xffe5;&#xffe5;&#xff…

算法 —— 快速幂

目录 P1045 [NOIP2003 普及组] 麦森数 P1226 【模板】快速幂 原理I 原理II P1226 代码解析 P1045 代码解析 P1045 [NOIP2003 普及组] 麦森数 本题来自洛谷&#xff1a;P1045 [NOIP2003 普及组] 麦森数&#xff0c;根据题意&#xff0c;我们可以看到本题需要计算最少2的1…

【Linux】权限的管理和Linux上的一些工具

文章目录 权限管理chgrpchownumaskfile指令sudo指令 目录权限粘滞位Linux中的工具1.软件包管理器yum2.rzsz Linux开发工具vim 总结 权限管理 chgrp 功能&#xff1a;修改文件或目录的所属组 格式&#xff1a;chgrp [参数] 用户组名 文件名 常用选项&#xff1a;-R 递归修改文…

Host碰撞实验

目录 Host碰撞原理 Host碰撞判断技巧 Host碰撞检测方法 Host碰撞实验步骤 从攻击者的视角来进行资产的梳理&#xff0c;采用全端口扫描子域名收集的方式&#xff0c;识别所有的企业资产暴露面。但即使是这样&#xff0c;往往会因为配置错误或是未及时回收等原因&#xff0c…

android13 frameworks里面常用的保存信息或者版本判断的方法

总纲 android13 rom 开发总纲说明 目录 1.前言 2. 数据库 2.1 代码读取用法参考 3.prop 属性配置 3.1 property的key值有哪些特点 4.区别 5. 其他数据存储 6.彩蛋 1.前言 frameworks 不像我们一般开发app那样,很多应用保存的方法都无法使用。这里记录我们系统rom开…

初学SpringMVC之 JSON 篇

JSON&#xff08;JavaScript Object Notation&#xff0c;JS 对象标记&#xff09;是一种轻量级的数据交换格式 采用完全独立于编程语言的文本格式来存储和表示数据 JSON 键值对是用来保存 JavaScript 对象的一种方式 比如&#xff1a;{"name": "张三"}…

ssh -D 选项用于动态(Dynamic)端口转发

举例实现不同ssh连接功能目录 一、功能简介 -D 支持 SOCKS5 协议&#xff0c;可以同时转发 TCP 和 UDP 报文 二、原理介绍 假设拥有三台主机&#xff0c;具体环境如下&#xff1a; 1. 主机 A&#xff1a;本地主机&#xff0c;即 SSH 客户 所在的主机&#xff0c;IP&#xff1…

Python游戏开发——天天酷跑(完整版教程)只需要200行代码就做出了一个天天酷跑小游戏,原来代码做游戏这么简单!零基础也能教你学会!

最近一段时间&#xff0c;小编发现已经好久没有给大家带来趣味游戏的案例展示了。刚好小编趁着周末写了一个《天天酷跑》的游戏&#xff0c;因此拿来跟大家一起分享&#xff0c;和大家一起来重温经典的酷跑游戏。 01 准备开发环境 俗话说&#xff0c;“工欲善其事&#xff0c…

详解:动画专业就业前景和就业方向

随着数字创意产业的蓬勃发展&#xff0c;动画专业已成为越来越多学子的选择。动画专业的就业前景日益广阔&#xff0c;不仅在游戏、影视、广告等传统领域有着广泛应用&#xff0c;还在建筑、教育、医学等多个行业展现出强大的潜力。 那么&#xff0c;何为动画专业呢&#xff1f…

快慢指针的应用(题目来源力扣oj训练)

快慢指针 快慢指针一般用来找到链表的中间节点&#xff0c;就是直接搞两个指针&#xff0c;快指针的移动是慢指针的两倍&#xff0c;那么为什么快慢指针可以找到中间节点&#xff0c;因为假设一个为n的链表&#xff0c;快指针走完慢指针也就是n/2。 具体案例 找链表的中间节…

【深度学习入门篇 ⑦】PyTorch池化层

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

Windows 系统利用 SSH 和 WSL2 子系统当服务器

由于最近组内需要将一台 Windows 系统的电脑 W A W_A WA​ 转成能通过 SSH 访问&#xff0c;并且能用 Linux 命令当服务器运行。忙活了一天&#xff0c;终于是把全部东西弄通了。 安装 SSH 首先就是 W A W_A WA​ 先要安装 OpenSSH 服务&#xff0c;直接按照下面的教程安装…

LVS+Keepalive高可用

1、keepalive 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主上&#xff0c;vip漂移到备服务器。 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到住服务器 1、配优先级 2、配置vip和真实服务器 3、主…

【Python实战因果推断】38_双重差分9

目录 Doubly Robust Diff-in-Diff Propensity Score Model Delta Outcome Model All Together Now Doubly Robust Diff-in-Diff 另一种纳入干预前协变变量和时间不变协变变量以考虑条件平行趋势的方法是制作双稳健差分法&#xff08;DRDID&#xff09;。要做到这一点&#…

鸿蒙语言基础类库:【@system.brightness (屏幕亮度)】

屏幕亮度 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.brightness]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import brightness from sy…

【接口自动化_13课_接口自动化总结】

一、自我介绍 二、项目介绍 自己的职责、项目流程 1&#xff09;功能测试&#xff0c;怎么设计用例的--测试策略 2&#xff09;功能测试为什么还有代码实现&#xff0c;能用工具实现&#xff0c;为什么还用代码实现。 基本情况 项目名称:项目类型&#xff1a;项目测试人员…

ubantu22.04安装OceanBase 数据库

1、管理员启动cmd,运行 sudo bash -c "$(curl -s https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/service/installer.sh)" 2、提示如下代表安装完成 3、修改数据库配置文件的密码 sudo vim /etc/oceanbase.cnf 然后保存退…

如何申请自费访问学者?自费访问学者材料要哪些?

四、申请自费访问学者需要准备哪些材料 访问学者的申请材料应包括个人简历、推荐信、成绩单、研究计划或课题、语言能力证明等&#xff0c;资费访问学者需提交财务证明。 申请表格填写基本个人信息、访学时间、访学目的等。且应在个人简历详细列出教育背景、工作经历、学术成…

一张图生成绘画全过程,这下人人都成“原画师”了

玩过SD的应该都知道ControlNet吧&#xff0c;最近ControlNet的作者Lvmin Zhang 又搞了一个开源项目PaintsUndo&#xff0c;在Github刚上线就收获了2.7k Star。 只需要上传一张静态图像&#xff0c;PaintsUndo就可以根据提供的图像自动生成对应的绘画全过程视频。 展示从一张白…