Java —— static关键字

static关键字

1.静态变量

1、个数:在内存中只有一份,被类的多个对象所共享、

2、加载时机:随着类的加载而加载,由于类只会加载一次,故静态变量也只有一份

3、内存位置:jdk6及之前存放在方法区;jdk7及之后存放在堆区

4、调用者:类 / 对象

5、消亡时机:随着类的卸载而消亡

6、开发中,什么时候需要将属性声明为静态的?

  • 判断当前类的多个实例是否能共享此成员变量,且其值是相同的
  • 开发中,常将一些常量声明是静态的。如:Math.PI

2.静态方法

1、包含:类方法、静态方法

2、通过”类.静态方法“直接调用静态方法

3、静态方法内可以调用静态的属性或静态的方法(类加载时已被加载),不可以调用非静态的结构(还没有被加载,在类实例化后才被加载,之后才能调用)

4、static修饰的方法内不能使用this/super,[属性和方法的前缀默认使用当前类来调用,可略]

5、补充:在类的非静态方法中,可以调用当前类中的静态结构(属性、方法)(已被加载,故可调用)或非静态结构(属性、方法)

6、开发中,什么时候需要将方法声明为静态的?

  • 方法内操作的变量如果都是静态变量,则此方法建议声明为静态方法
  • 开发中,常将工具类中的方法声明为静态方法。如:Array类、Math类

3.单例模式(Singleton)

介绍:采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

实现方式:

  • 饿汉式(比较饿,上来就要实例对象)

”立即加载“,随着类的加载,当前唯一的实例也被加载

优点:写法简单,由于内存中较早加载,使用更方便,更快。

​ 是线程安全的。

缺点:内存中占用时间比较长(随着类的加载而加载)。体现为内存泄漏(本身是垃圾,但是GC还没有被回收)。

class Bank{//1.类的构造器私有化private Bank(){}//2.在类的内部创建当前类的实例,并私有化private// [ 立即加载 static 随着类的加载而加载静态的对象 较早的出现在内存存在,需要的时候调用即可]// [ 生命周期较长 ]// 内存泄露:本身是垃圾,但是GC还没有被回收private static Bank instance = new Bank();//3.使用getXxx()方法获取当前类的实例,必须声明为static的public static Bank getInstance(){return instance;}}
  • 懒汉式(比较懒,用的时候再加载)、

”延迟加载“,需要使用对象的时候再创建

优点:再需要的时候再创建,节省内存空间

缺点:线程不安全

class GirlFriend{//1.类的构造器私有化private GirlFriend(){}//2.声明当前类的实例,[null,没有创建对象]private static GirlFriend instance = null;//3.通过getXxx()获取当前类的实例,如果未创建,则在方法内部进行创建//   [需要对象时才创建(延迟加载),空间上有一些节省]//   [线程不安全,当第一个对象调用没完成时,第二个也加载进来(两个对象),造成冲突]private static GirlFriend getInstance(){if (instance == null){instance = new GirlFriend();}return instance;}
}

4.代码块

代码块没有名,故只能自动执行

  • 静态代码块

1、格式:static{…}

2、加载时机:随着类的加载而加载(静态的、与类的生命周期相关,由于类的加载只会执行一次,进而静态代码块的加载也只会执行一次

3、作用:用来初始化====的信息

4、内部可以声明变量、调用属性或方法、编写输出语句等操作

5、静态代码块(类先加载)的执行先于非静态代码块(对象后加载)

6、静态代码块内部只能调用静态的结构[原因:非静态的还没有被加载,调用不到](即静态的属性、方法),不能调用非静态的结构(即非静态的属性、方法)

7、开发中:对静态的属性做的一些赋值,相当于需要一个自动会调用的,且仅调用一次的几行代码,最合适的位置就是静态代码块

  • 非静态代码块(普通代码块)

1、格式:{…}

2、加载时机:随着对象的创建而执行,非静态的,只和对象的创建有关,每创建当前类的一个实例,就会执行一次非静态代码块

3、作用:用来初始化对象的信息

4、内部可以声明变量、调用属性或方法、编写输出语句等操作

5、如果声明有多个非静态代码块,则按照声明的先后顺序执行

6、非静态代码块内部可以调用静态的结构[原因:静态结构再加载类时已经加载完成,可以调用](即静态的属性、方法),也可以调用非静态的结构(即非静态的属性、方法)

7、对非静态的属性做的一些赋值

5.为什么说静态结构随着类的加载而加载

  • 静态结构成员在Java中被声明为static,它们属于类本身的,而不是类的任何一个对象。

  • 这些成员随着类的加载而加载,是因为它们需要在一个类的对象被创建之前就存在并可供访问

  • 在Java中,一个类首次被使用时(无论是创建对象、调用静态方法还是访问静态字段),如果该类尚未被加载到JVM中,则会触发类的加载过程。类的加载包括加载、验证、准备、解析和初始化五个阶段。在这些阶段中,静态变量和静态代码块会在“初始化”阶段被执行。这意味着静态成员是随着其所属类的加载而加载的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46893.shtml

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

相关文章

设计模式总结(设计模式的原则及分类)

1.什么是设计模式? 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结…

SpringBoot中动态注册Bean的方式

测试环境,本文源码 Java:8SpringBoot:2.5.14示例场景:动态注册ProxyServlet,间接实现类似于Nginx的反向代理功能 先理解如何实现动态注册 Bean 。 由于在 SpringBoot 中,先进行 Bean 的定义,…

企业全历史行为数据助ToB企业决策层开启营销的上帝视角

“上帝视角”是每个企业家都渴望拥有的。上帝视角的能力有多么吸引人呢?通常,一个企业家在技术、产品、营销中的任何一个领域拥有上帝视角的能力,就足可以让他的企业大杀四方,甚至创造历史。 在技术或产品领域,靠“上…

沙袋装袋机的原理和特点_鼎跃安全

在现代工业和建筑领域,沙子等散状物料的包装是一个必不可少的环节。传统的手工包装方式效率低下且劳动强度大,而沙袋装袋机的出现则极大地提高了包装效率和质量。 一、沙袋装袋机的工作原理 沙子通过输送系统从储料仓输送到装袋机的料斗中。输送系统设计…

Eureka——Spring Cloud中的服务注册与发现组件

目录 1. 前言2. Eureka的概述2.1 Eureka的核心功能2.2 Eureka的角色与特点2.3 Eureka的使用优势 3. 创建 Spring Cloud 的注册中心3.1 创建一个父项目3.2 创建Spring Cloud的注册中心Eureka 4. 创建服务提供者5. 创建一个消费者Consumer,调用服务提供者Provider 1. …

java链表常见简单面试算法题

头插法、尾插法 头插法:先待插入指向头结点的next,后头结点的next指向待插入。 尾插法:借助尾指针,直接插入 /*** 头插法* param head* return*/public static Node head_insert(Node head, int t){Node nodenew Node(t);node.set…

C++设计模式(装饰器模式)

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变原有对象结构和功能的基础上,动态地给对象添加额外的职责或功能。 装饰器模式的主要特点包括: 1. 保持了被装饰对象的核心职责不变。2. 能够透明地…

【Diffusion学习】【生成式AI】Stable Diffusion、DALL-E、Imagen 背後共同的套路

文章目录 图片生成Framework 需要3个组件:相关论文【Stable Diffusion,DALL-E,Imagen】 具体介绍三个组件1. Text encoder介绍【结论:文字的encoder重要,Diffusion的模型不是很重要!】评估指标:…

Webpack看这篇就够了

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

React@16.x(57)Redux@4.x(6)- 实现 bindActionCreators

目录 1,分析1,直接传入函数2,传入对象 2,实现 1,分析 一般情况下,action 并不是一个写死的对象,而是通过函数来获取。 而 bindActionCreators 的作用:为了更方便的使用创建 action…

补充.IDEA的使用

首先我们要了解在idea中Java工程由项目(project)、模块(module)包(package)、类(class)组成。 他们之间的关系是project包含module包含package包含class。 所以我们要按照先建一个pr…

AutoMQ 社区双周精选第十二期(2024.06.29~2024.07.12)

本期概要 欢迎来到 AutoMQ 第十一期双周精选!在过去两周里,主干动态方面,AutoMQ 跟进了 Apache Kafka 3.4.x BUG 修复,并进行了CPU & GC 性能优化,另外,AutoBalancing 的 Reporter 和 Retriever 也将支…

Linux的相关命令

Linux 1. 什么是Linux系统 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布,它主要受到Minix和Unix思想…

浏览器缓存:强缓存与协商缓存实现原理有哪些?

1、强缓存:设置缓存时间的,那么在这个时间内浏览器向服务器发送请求更新数据,但是服务器会让其从缓存中获取数据。 可参考:彻底弄懂强缓存与协商缓存 - 简书 2、协商缓存每次都会向浏览器询问,那么是怎么询问的呢&…

wordpress 调用另外一个网站的内容 按指定关键词调用

要在WordPress中调用另一个网站的内容并根据指定关键词进行筛选,你可以使用以下代码。这段代码使用了WordPress内置的wp_remote_get函数来获取远程网站的内容,然后使用PHP的DOMDocument和DOMXPath类来解析HTML并筛选出包含指定关键词的内容。 首先&…

H2数据库启动时,设置非“全零监听”

全零监听 全零监听(即将监听地址设置为全零地址,如IPv4中的0.0.0.0或IPv6中的::)在网络服务配置中确实存在一定的安全风险。以下是全零监听可能带来的安全风险: 1. 暴露服务到不安全网络 全网段监听:将监听地址设置…

中介者模式(行为型)

目录 一、前言 二、中介者模式 三、总结 一、前言 中介者模式(Mediator Pattern)是一种行为型设计模式,又成为调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合…

2024最新超详细SpringMvc常用注解总结

SpringMVC常用注解 控制器(Controller)相关注解: 1.Controller Controller 注解用于标识一个类为 Spring MVC 的控制器,它能够处理用户的请求并返回相应的视图或数据。通常与 RequestMapping 注解一起使用,以定义请求…

解决NodeJS控制台输出中文乱码

前言 不知道是系统升级还是Nodejs升级的原因,我从NodeJS19.x升级到20.x后,项目输出的中文就变成了乱码.经测试chcp 65001指令不能有效的解决问题. 于是在AI的加持下得到了这条指令(好用): [Console]::OutputEncoding [System.Text.Encoding]::UTF8在powershell中执行如上指…

JavaScript基础(十三)

Math对象 方法+说明 ceil() 对数进行上舍入 例:Math.ceil(12.5)返回13; Math.ceil(-12.5)返回-12 (简单点来记就是ceil返回的值要比传入的大) var…