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

java之static详细总结

static也叫静态,可以修饰成员变量、成员方法。

成员变量

按照有无static分为两种:

  • 类变量:static修饰,属于类,与类一起加载一次,在内存中只有一份,会被类的全部对象共享
  • 实例变量(对象变量):无static修饰,属于每个对象的。

代码举例:

//先创建一个学生类
public class Student {//类变量static String name;//实例变量(对象变量)int age;}//测试
public class Test {public static void main(String[] args) {//1、类变量的使用//类名.类变量Student.name="袁华";//对象.类变量(不推荐)Student s1=new Student();s1.name="马冬梅";Student s2=new Student();s1.name="秋雅";System.out.println(s1.name); //输出秋雅System.out.println(Student.name);  //输出秋雅//2、实例变量的使用:属于每个对象的变量//对象、实例变量(不能通过类名.变量名访问)s1.age=23;s2.age=18;System.out.println(s1.age);  //输出23System.out.println(s2.age);  //输出18}
}

 一开始先将Test.class加载到方法区,然后main方法入栈,运行到Student.name="张三"会将Student.class加载到方法区,并检查是否有类变量,如果有也会将类变量立即加载到堆内存中,初始值为null,然后赋值成 袁华

 然后在堆内存中创建学生对象,学生变量s1指向这个对象,然后执行 s1.name=“马冬梅”  会在s1指向的对象中去寻找这个变量,如果没有这个变量,则通过类的地址去寻找Student.class,然后通过这个寻找到name并赋值成 “马冬梅”

 同理s2的创建和修改和上面一样

 最后s1和s2的name都指向同一个,所以最后输出的名字都是“秋雅”。

下面再看实例变量age的变化:

s1.age=23会通过s1找到第一个学生对象,将其变量age的值改为23;同理s2也是如此

类变量的应用场景 

        在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住。例如,一个类可以记住自己创建了多少个对象,如下图

成员方法

按照有无static分为两种:

  • 类方法:static修饰,属于类
  • 实例方法:无static修饰,属于每个对象的。

代码举例:

public class Student {double score;//类方法public static void printHelloWorld(){System.out.println("Hello World");}//实例方法public void printPass(){System.out.println("成绩"+(score>=60?"及格了":"没及格"));}
}//测试
public class StaticTest {public static void main(String[] args) {//1、类方法的使用//类名.类方法Student.printHelloWorld();//对象.类方法(不推荐)Student s1=new Student();s1.printHelloWorld();//2、实例方法的使用:属于每个对象的方法//对象.实例方法(不能通过类名.方法名访问)s1.printPass();}
}

一开始先将Test.class加载到方法区,然后main方法入栈,运行到Student.printHelloWorld()会将Student.class加载到方法区,然后通过学生类找到printHelloWorld()方法,进行打印

  然后在堆内存中创建学生对象,学生变量s1指向这个对象,然后执行 s1.printHelloWorld() 时,会通过s1找到它指向的学生对象,然后通过学会对象找到Student这个类,通过这个类找到这个printHelloWorld()方法 。如图

 实例方法也是如此,但它会访问这个对象的一些变量,所以不能通过类名调用(通过类名调用就不知道访问哪个对象的变量了)。

补充:main方法也是类方法,也是通过类名.main进行调用的

应用场景

类方法最常见的应用场景是做工具类:提高了代码复用;调用方便,提高了开发效率

注意事项

1. 类方法中可以直接访问类成员,不可以直接访问实例成员

public class Student {static String schoolname;//类变量double score;//实例变量//类方法public static void printHelloWorld(){//同一个类中,访问类成员,可以省略类名schoolname="张三";printHelloWorld2();
//        score=12.0;//报错
//        printPass();//报错}//类方法public static void printHelloWorld2(){System.out.println("Hello World");}//实例方法public void printPass(){System.out.println("成绩"+(score>=60?"及格了":"没及格"));}
}

2. 实例方法中既可以直接访问类成员,也可以直接方法实例成员

public class Student {static String schoolname;//类变量double score;//实例变量//类方法public static void printHelloWorld2(){System.out.println("Hello World");}//实例方法public void printPass(){schoolname="李四";printHelloWorld2();printPass2();System.out.println(score);}//实例方法public void printPass2(){}
}

3. 实例方法中可以出现this关键字,类方法中不可以出现this关键字

因为实例方法用this时会拿到这个对象,而类方法拿不到对象

应用知识

1. 代码块

代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。

代码块分为两种:

  • 静态代码块
    • 格式:static{}
    • 特点:类加载时自动执行,由于类只加载一次,所以静态代码块也只会执行一次
    • 作用:完成类的初始化,例如:对类变量的初始化赋值。
      public class Student {static int number=80;static{System.out.println("静态代码块执行了");}
      }
      //测试
      public class StaticTest {public static void main(String[] args) {System.out.println(Student.number);}
      }//输出静态代码块执行了
      80
  • 实例代码块
    • 格式:{}
    • 特点:每次创建对象时,执行实例代码块,并在构造器前执行
    • 作用:和构造器一样,都是用来完成对象的初始化的。例如对实例变量进行初始化赋值

2. 单例模式

确保一个类只有一个对象

写法

  • 把类的构造器私有
  • 定义一个类变量记住类的一个对象
  • 定义一个类方法,返回对象
    public class A {//2.定义一个类变量记住类的一个对象private static A a=new A();//1.私有类的构造器private A() {}//3.定义一个类方法,返回对象public static A getObject(){return a;}
    }

 实现方式

  • 饿汉式单例:拿到对象时,对象早已经创建好了。上面便是。
  • 懒汉式单例:拿到对象时,才开始创建对象。
    public class B {//1.类的构造器私有private B() {}//2.定义一个类变量,用户存储这个类的一个对象private static B b;//3.定义一个类方法,要保证第一次调用时才创建一个对象,后面调用时都会用这同一个对象public static B getObject(){if(b==null){b=new B();}return b;}
    }

相关文章:

java之static详细总结

static也叫静态,可以修饰成员变量、成员方法。 成员变量 按照有无static分为两种: 类变量:static修饰,属于类,与类一起加载一次,在内存中只有一份,会被类的全部对象共享实例变量(…...

RabbitMQ3.13.x之六_RabbitMQ使用场景

RabbitMQ3.13.x之六_RabbitMQ使用场景 文章目录 RabbitMQ3.13.x之六_RabbitMQ使用场景1. 为什么选择 RabbitMQ?1. 可互操作2. 灵活3. 可靠 2. 常见用户案例1. 服务解耦2. 远程过程调用3. 流处理4. 物联网 1. 为什么选择 RabbitMQ? RabbitMQ 是一个可靠且…...

C++ 类和对象(初篇)

类的引入 C语言中,结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式: class className {// 类体:由成员函…...

微软推出GPT-4 Turbo优先使用权:Copilot for Microsoft 365商业用户享受无限制对话及增强图像生成能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

Spring Boot Actuator

概述 Spring Boot Actuator是Spring Boot的一个功能模块,用于提供生产环境中常见的监控和管理功能。它提供了各种端点(endpoints),可以用于监视应用程序的运行状况、收集应用程序的指标数据以及与应用程序进行交互。 以下是Spri…...

我与C++的爱恋:类与对象(一)

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 ​C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象&…...

os模块篇(十八)

文章目录 os._exit(n)os.forkpty()os.kill(pid, sig, /)os.killpg(pgid, sig, /)os.nice(increment, /)os.pidfd_open(pid, flags0)os.plock(op, /)os.popen(cmd, moder, buffering-1)os.posix_spawn(path, argv, env, *, file_actionsNone, setpgroupNone, resetidsFalse, set…...

Oracle 数据库工作中常用知识点:sql语法与常用函数

.to_date()函数 to_date函数是Oracle特有的函数,该函数用来做日期转换。 举例: SELECT TO_DATE(‘2006-05-01 19:25:34’, ‘YYYY-MM-DD HH24:MI:SS’) FROM DUAL   日期格式:     YYYY、YYY、YY 分别代表4位、3位、2位的数字年    …...

软件工程

开发模型 瀑布模型 用于结构化模型开发 适用需求明确或者二次开发 原型模型 适用需求不明确 演化模型 增量模型 适用需求不明确 先做一块,再做一块,这样不断的对核心功能的审视,降低风险 螺旋模型 由多个模型组合成 适用需求不明…...

【御控物联】JavaScript JSON结构转换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么?二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…...

免注册,ChatGPT可即时访问了!

AI又有啥进展?一起看看吧 Apple进军个人家用机器人 Apple在放弃自动驾驶汽车项目并推出混合现实头显后,正在进军个人机器人领域,处于开发家用环境机器人的早期阶段 报告中提到了两种可能的机器人设计。一种是移动机器人,可以跟…...

探索未来游戏:生成式人工智能AI如何重塑你的游戏世界?

生成式人工智能(Generative AI)正以前所未有的速度改变着各行各业的运作模式。其中,游戏产业作为科技应用的前沿阵地,正经历着前所未有的变革。本文将探讨生成式人工智能如何重塑游戏产业,以及这一变革背后的深远影响。…...

ubuntu23设置kibana后台启动服务

要在Ubuntu 23系统中设置Kibana作为系统服务,以便能够通过systemd管理其启动、停止、重启以及设置开机自动启动,可以按照以下步骤操作: 1. 创建Kibana systemd服务单元 创建一个名为kibana.service的文件在 /etc/systemd/system/ 目录下&am…...

身份证实名制、C#身份核验代码示例、身份证查询

在以前,企业采用人工审核的方式对线上用户进行身份信息真伪的核验,在用户上传身份信息后,人工进行后台审核,虽能满足企业对用户实名认证的需求,但效率慢、耗时长,且存在一定的人为误差,对高度PS…...

【leetcode面试经典150题】15.分发糖果(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...

Elasticsearch如何选择版本

不同版本的ES差异非常大,包括不局限于ES语法、架构、API、集群搭建等等。这些差异足以导致不同版本是否能满足你的业务场景以及后续开发维护成本等各种问题。 先说结论,以个人实践经验及综合考虑推荐使用 7.x 版本中的 7.10版本 ES版本对比 以下是通过…...

P8749 [蓝桥杯 2021 省 B] 杨辉三角形

[蓝桥杯 2021 省 B] 杨辉三角形 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1 , 1 , 1 , 1 , 2 , 1 , 1 , 3 , 3 , 1 , 1 , 4 , 6 , 4 , 1 , … 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1, …...

MySQL数据库——1.创建数据库

在 MySQL 数据库中,要创建一个新的数据库,可以使用 SQL 命令 CREATE DATABASE。创建数据库是管理数据的第一步,它提供了一个容器,用于存储表、视图、存储过程等数据库对象。 示例: CREATE DATABASE my_database; 在…...

计算机视觉研究院 | Drone-YOLO:一种有效的无人机图像目标检测

本文来源公众号“计算机视觉研究院”,仅用于学术分享,侵权删,干货满满。 原文链接:Drone-YOLO:一种有效的无人机图像目标检测 无人机图像中的目标检测是各个研究领域的重要基础。然而,无人机图像带来了独…...

[C#]使用OpencvSharp去除面积较小的连通域

【C介绍】 关于opencv实现有比较好的算法,可以参考这个博客OpenCV去除面积较小的连通域_c#opencv 筛选小面积区域-CSDN博客 但是没有对应opencvsharp实现同类算法,为了照顾懂C#编程同学们,因此将 去除面积较小的连通域算法转成C#代码。 方…...

联邦学习目前面临的挑战以及解决方案

学习目标: 联邦学习目前面临的挑战以及解决方案 学习内容: 联邦学习是一种新兴的人工智能基础技术,它在保障大数据交换时的信息安全、保护终端数据和个人数据隐私、保证合法合规的前提下,在多参与方或多计算结点之间开展高效率的…...

Day60:WEB攻防-XMLXXE安全无回显方案OOB盲注DTD外部实体黑白盒挖掘

目录 XML&XXE-传输-原理&探针&利用&玩法 XXE 黑盒发现 XXE 白盒发现 XXE修复防御方案 有回显 无回显 XML&XXE-黑盒-JSON&黑盒测试&类型修改 XML&XXE-白盒-CMS&PHPSHE&无回显 知识点: 1、XXE&XML-原理-用途&…...

解锁网络安全新境界:雷池WAF社区版让网站防护变得轻而易举!

网站运营者的救星:雷池WAF社区版 ️ 嘿朋友们!今天我超级激动要跟你们分享一个神器——雷池WAF社区版。这个宝贝对我们这帮网站运营者来说,简直就是保护伞! 智能语义分析技术:超级侦探上线 先说说为啥我这么稀饭它。雷…...

RabbitMQ安装详细教程

(一)在Windows系统上安装Erlang的步骤如下: 打开Erlang的官方下载页面,选择适合你的Windows系统的版本进行下载。 下载完成后,双击运行下载的.exe文件,进入Erlang的安装向导。 在安装向导中,按…...

如何快速写出一个完整的测试用例

测试用例是为了验证软件功能或需求而设计的一组测试输入、执行条件和预期结果。编写测试用例的目的是确保测试过程全面高效、有据可查。 一般来说,编写测试用例的流程包括以下几个步骤: 分析需求:阅读需求文档,理解软件的功能和业…...

Docker容器与虚拟化技术:OpenEuler 部署 ES 与 Kibana

目录 一、实验 1.环境 2.OpenEuler 部署 ES (EalasticSearch) 3.OpenEuler 部署 Kibana 4.部署 Elasticvue插件 5.使用cpolar内网穿透 6.使用Elasticvue 一、实验 1.环境 (1)主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 1…...

数学中的各种符号虚数概念

max i∈S​A i ​ ≥ ∑ i∈S​B i​. 这个不等式表达的意思是对于集合 S 中的任意非空子集,子集中的最大的 A_i(A 的元素)的值都大于等于子集中所有 B_i(B 的元素)的值的总和。换句话说,集合 S 中的最大…...

什么是中间件

中间件是指在应用程序与操作系统之间提供服务的软件,它可以隐藏底层操作系统的复杂性,为应用程序提供各种实用的服务,以便应用程序更好地实现业务逻辑。中间件通常提供如下几种服务: 数据库连接:中间件可以为应用程序提…...

RabbitMQ面经 手敲浓缩版

保证可靠性 生产者 本地事务完成和消息发送同时完成 通过事务消息完成 重写confirm在里面做逻辑处理 确保发送成功(不成功就放入到重试队列) MQ 打开持久化确保消息不会丢失 消费者 改成手动回应 不重复消费 生产者 保证不重复发送消息 消费者…...

解锁金融数据中心场景,实现国产化AD替代,宁盾身份域管为信创电脑、应用提供统一管理

随着信创国产化改造持续推进,越来越多的金融机构不断采购信创服务器、PC、办公软件等,其 IT 基础设施逐渐迁移至国产化 IT 架构下。为支撑国产化 IT 基础设施的正常使用和集中管理运维,某金融机构数据中心的微软Active Directory(…...

帮别人建网站做诈骗的要判刑吗/百度应用app下载

CentOS设置系统时间和时区 一、设置时区方法一:使用setup工具 setup 选择Timezone configuration 选择Asia/Shanghai 空格键勾选上System clock uses UTC 就OK了。方法二:使用tzselect工具 tzselect 选择亚洲Asia 5 选择国家China 9 选择地区central Chi…...

如何自学建网站/国际军事新闻

http://blog.sina.com.cn/s/blog_533074eb01015zv1.html 一般说来,数据链路层发出的数据包称为frame,地址是链路层的地址,如mac地址;网络层发出的数据包称为packet,地址是网络层地址,如ip地址&#xff1b…...

wordpress循环所有文脏/搜索引擎技术基础

我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Java Marker Interface(标记接口) 使用JDK自带的工具jsta…...

南京平台网站建设/网站换友链平台

----------段概述 segment----(在刚开始时,我理解为“段”就算是“表”,虽然有差误,但却有利理解oralce的存储结构)数据段是一系列区间 , 在这个特定逻辑存储结构存储的数据都在一个表空间内 . 例如对于每一种数据库 对象 ( 表、索引 ) &…...

来宾网站建设公司/百度总部

1.队列的介绍 队列的定义 队列(Queue)是一种线性存储结构。它有以下几个特点:按照"先进先出(FIFO, First-In-First-Out)"方式进出队列。队列只允许在"队首"进行取出操作(出队列),在&q…...

做presentation的网站/网络优化工程师是干什么的

了解自己真正的潜能你的成功与否只有你自己能做评判,绝对不要让其他人来定义你的成功,只有你能决定自己要成为什么样的人、做什么事、拥有什么,只有你知道什么能使自己满足、什么令自己有成就感。知人者智,知己者强其实&#xff0…...