java field static_Java基础之关键字static

2023-11-17

static是Java中的一个关键字,用来修饰成员变量与成员方法,还可以用于编写静态代码块,对于被static修饰的东西,JVM在加载类的时候,就给这些变量在内存中分配了一定的空间,即在编译阶段时就为这些成员变量的实例分配了空间。

一、静态变量

被static关键字修饰的成员变量叫做静态变量,前面我们讲到成员变量与局部变量的区别,那么静态变量与成员变量又有哪些不同呢?

1、调用方式

静态变量:类变量,可以直接通过类名调用,也可以通过对象名调用,这个变量属于类

成员变量:实例变量,只能通过对象名调用,这个变量属于对象

2、存储位置

静态变量:存储在方法区中的静态区

成员变量:存储在堆内存

3、生命周期

静态变量:随着类的加载而存在,随着类的消失而消失

成员变量:随着对象的创建而存在,随着对象的消失而消失

4、与对象的相关性

静态变量:所有对象共享的数据,在内存中只有一个副本

成员变量:每个对象所特有的数据,在内存中存在多个副本,每个副本之间互不影响

看了以上几点,我们会想那什么时候使用static来修饰我们的变量呢,从第4点可以看出当所定义的变量是所有的实例所共享的数据的时候,我们就可以用static来修饰,例如,我们每个人都有国籍,通常情况下国籍都是中国,那么这个时候就可以用static来修饰了

1 packagedemo;2

3 public classPerson {4 privateString name;5 private intage;6 private static String nationality = "中国";7

8 ....9 }

这样当构造Person类的时候就不用每次都给nationality这个属性分配内存空间,这时在内存中就只有一个副本,每个实例对象都指向它,当其中一个改变了nationality变量的值,则其他对象的nationality值也随着改变。

二、静态方法

被static关键字修饰的成员方法叫做静态方法,看看我们最常见的main方法

1 packagedemo;2

3 public classMainDemo {4 public static voidmain(String[] args) {5 System.out.println("main method");6 }7 }

此时代码中并没有构造一个MainDemo对象,但是运行程序却在控制台打印出了main method,这个例子可以说明静态方法优于对象而存在,与静态变量一样,在类加载时就存在了,如果我们在静态方法中调用非静态变量与非静态方法会有什么现象呢,看下面这段代码

1 packagedemo;2

3 public classMainDemo {4 privateString name;5 private staticString address;6

7 public static voidmain(String[] args) {8 show1(); //Cannot make a static reference to the non-static method9 //show1() from the type MainDemo

10 show2();11 }12

13 private voidshow1() {14 System.out.println(name);15 System.out.println(address);16 }17

18 private static voidshow2() {19 System.out.println(name); //Cannot make a static reference to the20 //non-static field name

21 System.out.println(address);22 }23 }

代码中第8行与第19行报错,报错信息在代码右侧已经注释出来,由于静态方法在类加载的时候就已经在内存中了,此时对象还不存在,故在静态方法中无法访问非静态变量,非静态变量在创建对象的时候才会在堆空间中存在,一个不存在的东西又怎么能访问呢,同样在静态方法中无法访问非静态方法的原因与之一样。

既然非静态方法为所有实例所共享,那么该方法也为类所有,那自然可以通过类名调用

1 packagedemo;2

3 public classMainDemo {4 private staticString address;5

6 public static voidmain(String[] args) {7 MainDemo.show();8 }9

10 private static voidshow() {11 System.out.println(address);12 }13 }

三、静态代码块

static块可以置于类中的任何地方,类中可以有多个static块。与成员变量,成员方法一样,在类被加载的时候静态代码块就存在于内存中了,在类初次加载的时候,JVM按照static块的顺序来执行每个static块,并且只会执行一次,这样无形中也提高了点性能。

1 packagedemo;2

3 public classStaticDemo {4 private static String address = "china";5

6 static{7 System.out.println("first static block");8 }9

10 static{11 System.out.println("second static block");12 }13

14 public static voidmain(String[] args) {15 StaticDemo.show();16 }17

18 private static voidshow() {19 System.out.println(address);20 }21 }

输出结果:

first staticblock

secondstaticblock

china

从以上我们总结出以下static关键字的一些特性:

1、可以用来修饰成员变量,成员方法,静态代码块;

2、随着类的加载而加载,优先于对象而存在,被所有的对象所共享,可以被类名直接调用(建议),当然也通过实例调用,虽然在内存中的副本只有一个,不过生命周期长,当类被回收时,静态区域空间才会被释放;

3、静态方法中只能访问静态变量与静态成员;

4、当所有对象共享某个数据的时候,就把这个成员变量定义为静态的;

5、静态代码块只执行一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java field static_Java基础之关键字static 的相关文章

  • 对虚拟机原有磁盘扩容

    对虚拟机原有磁盘扩容 扩容不会导致数据丢失 1 先关闭虚拟机 手动去虚拟机的硬盘扩容 2 lsblk df h查看磁盘容量 3 fdisk dev sda命令扩展 输入P查看分区的start和end的值 需要先删除要扩容的分区 输入d 选择
  • 转:使用DOS命令chcp查看windows操作系统的默认编码以及编码和语言的对应关系

    代码页是字符集编码的别名 也有人称 内码表 早期 代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称 当时通用的操作系统都是命令行界面系统 这些操作系统直接使用BIOS供应的VGA功能来显示字符 操作系统的编码支持也就依靠BIOS的编
  • 微信小程序绘制二维码

    一 前言 在日常的小程序项目中 会经常遇到需要动态绘制二维码的需求 使用场景很多 例如绘制在海报上 例如制作票务码 核销码等等 这篇文章是应一位好友的需求而写的 也希望能够给有需要的同学一些帮助 二 实现原理 使用微信小程序的canvas组
  • STM32的低功耗模式

    目前的低功耗设计主要从芯片设计和系统设计两个方面考虑 随着半导体工艺的飞速发展和芯片工作频率的提高 芯片的功耗迅速增加 而功耗增加又将导致芯片发热量的增大和可靠性的下降 因此 功耗已经成为深亚微米集成电路设计中的一个重要考虑因素 为了使产品
  • HTML、CSS制作小米商城网页首页源码解析

    简介 这是我学习前端以来仿写的第一个项目 沿着尚硅谷李立超老师的教学视频学习 在仿写这个项目的过程中即巩固了这两周以来的知识 也增加了一些小经验 主要是老师传授 同时也让自己更加有信心学习下去 相信自己一定会实现自己的小梦想 加油 小米官网
  • [运算放大器系列]二、电压转4 - 20MA电流电路分析

    运算放大器系列 二 电压转4 20MA电流电路分析 1 电路原理图 2 原理分析 1 电路原理图 偶然在网上看到一个4 20MA转换电路原理图如下 2 原理分析 R L R L RL 为负载 分析电流流向如上图箭头所示可以得到 假设Rloo
  • Elasticsearch 6.1 TransportClient实现多条件重排序搜索查询之FilterFunctionBuilder和FunctionScoreQueryBuilder

    搜索条件 在Index为10000下查找标题包含 IPhone 优先取 品牌手机 这个分类 销量越高越前 结果随机给用户展示 JAVA 代码实现片段 String searchContent IPhone TransportClient c
  • UI测试和接口测试

    安全测试是我下个阶段的主学习了 UI测试和接口测试 安全和性能调优 和测试相关的一些专业术语 测试的发展方向大体是4种 接口自动化测试 UI自动化测试 持续集成 和测试相关的一些专业术语 QA quality assurance 质量保证
  • 调试远程tomcat服务器

    1 关闭linux下防火墙 不然远程客户机可能无法连接上该tomcat 注意不直接关闭防火墙 而是将远程客户机与端口添加到防火墙上 关闭主要是最简单 service iptables stop 2 启动tomcat 命令行下运行 catal
  • ML Impossible and Rescure

    No Rule to Define will cause conflict Using available data to estimate target function if without rule target is unknown
  • PageHelper的概述和基本使用

    PageHelper介绍 PageHelper是国内非常优秀的一款开源的mybatis分页插件 它支持基本主流与常用的数据库 例如mysql oracle mariaDB DB2 SQLite Hsqldb等 本项目在 github 的项目
  • 线与逻辑详解

    什么是线与逻辑 需要和CMOS漏极开路门 Open Drain OD 一起介绍 通常CMOS门电路都有反相器作为输出缓冲电路 而在工程实践中 有时需要将两个门的输出端并联以实现 与 逻辑的功能称为 线与 逻辑 或者用于驱动大电流负载 或者实
  • 第一章 webpack与构建发展简史

    官方loader和插件 Loaders webpack Plugins webpack 为什么需要构建工具 初识webpack webpack默认配置文件 webpack config js 可以通过webpack config
  • 数据结构-图的创建(邻接矩阵,邻接表)C语言实现

    图的定义 图 Graph G由两个集合V和E组成 记为 G V E 其中V是顶点的有穷非空集合 其实就是顶点 E是V中顶点偶对的有穷集合 就是边 V G 和E G 通常分别表示图G的顶点集合以及边集合 E G 可以为空集合 但是此时的图只有
  • 502 Bad Gateway The proxy server received an invalid response from an upstream server

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 打开网站一直报错 查看了一下nginx错误日志 发现很多的报错 2018 12 24 11 02 51 alert 20026 20026 33113943 socket
  • 【渗透测试笔记】之【内网渗透——Windows系统散列值获取与防范】

    拓扑图 Windows系统散列值获取 1 通过CS模块获取用户凭证信息 在获取到目标主机权限后 我们可以抓取hash和dump明文密码 这两项功能都需要管理员权限 如果权限不足 先要进行提权操作 抓取密码哈希 右键被控主机 gt Acces
  • 【OpenCV学习笔记】【教程翻译】五 (车牌识别之OCR分割)

    车牌识别 车牌识别的第二步主要是提取出车牌中的字符 对于每个被检测出的车牌 我们对车牌进行分割获取每个字符 然后用神经网络机器学习算法实现字符的识别 在这个过程中 我们也可以学习到如何评估一个分类算法 OCR分割 首先 我们将车牌图像作为具
  • sqli-labs 21——40关攻略

    Less 21 基于错误的复杂的字符型Cookie注入 base64编码 单引号 报错型 cookie型注入 本关和less 20相似 只是cookie的uname值经过base64编码了 登录后页面 圈出来的地方显然是base64加密过的
  • 浅谈Linux的文件系统, 新增XFS.Ext3.GFS.ReiserFS.JFS相关知识

    如果您是一位新手 也许 您还不知道如何把文件从Windows拷贝到 Linux上吧 下面 我们将说明Unix文件系统以及mount的工作过程 然后再比较详细地讨论 mount的使用和有关选项 如果您已经了解Unix文件系统是如何工作的 那么

随机推荐

  • debug调试神器pysnooper

    异常bug定位 print 函数也可以 但效率上还是慢 后来发现了一个叫PySnooper的装饰器 一般debug调试 都是在我们可能觉得会有问题的地方 去打印输出 看下实际输出了什么 然后思考问题所在 下载库 pip install py
  • python3 练习题100例 (十二)

    题目十二 打印出所有的 水仙花数 所谓 水仙花数 是指一个三位数 其各位数字立方和等于该数本身 例如 153是一个 水仙花数 因为153 1的三次方 5的三次方 3的三次方 usr bin env python3 coding utf 8
  • “ModuleNotFoundError: No module named sklearn”解决办法

    最近在跑实验的时候 需要导入sklearn 但是运行代码一直提示 ModuleNotFoundError No module named sklearn 实验中导入sklearn的代码 from sklearn import metrics
  • Linux CentOS7 中 完美解决VMTools失效,windows 与 Liunx间完美复制文件,无报错的解决方案

    问题 我也是才刚使用CentOS7没多久 搭建好环境后出现比较头疼的问题就是 Windows 和 Linux 之间无法复制粘贴文本和文件 这个问题只要在虚拟机中安装 VMTools 就能解决 但是不知道什么原因导致 我在CentOS 6 8
  • Linux 狂神说学习笔记

    狂神说linux Linux 基本目录 目录相关命令 文件属性 查看文件 硬链接和软链接 vim 账号管理 用户组管理 磁盘管理 进程管理 环境安装 基本目录 目录相关命令 ls al 列出目录 a所有文件包括隐藏文件 l列出所有文件包括文
  • MyBatis ognl.NoSuchPropertyException 或者 Invalid bound statement (not found)

    描述 SpringBoot Mybatis plus 项目 运行时出现如下错误 ognl NoSuchPropertyException 没有对应属性异常 Invalid bound statement not found 绑定语句无效 未
  • 问题小结(3)-dialog标题居中

    dialog标题居中问题 用系统的AlertDialog Builder创建dialog时 如果需要将dialog的title居中显示 需要调用 setCustomTitle View view 方法 对需要设置的view设置居中的相关属性
  • zookeeper 分布式共享锁的流程图

    1分布式共享锁的流程图 原理 package cn itcast bigdata zklock import java util Collections import java util List import java util Rand
  • 水球图 及各种参数设置

    水球图 Liquid Fill Chart 是Echarts的一个插件 在官方文档中没有 可以用来优雅的展示百分比数据 水球图 gif 安装 HTML中引入水球图
  • docker基础1——架构组成、安装配置

    文章目录 一 发展起源 1 1 传统虚拟化与容器虚拟化 1 2 docker底层核心技术 1 2 1 命名空间 1 2 2 控制组 1 3 docker工作方式 1 4 docker容器编排 1 5 docker优劣势 1 6 docker
  • iframe的替代品

    面试题 使用过iframe框架 那你对于iframe框架的优缺点知道多少 并且由于iframe的一些缺点 国内外针对这个框架的替代品你知道有哪些呢 知识点1 iframe框架的优缺点 优点 1 可以跨域请求其他网站 并将网站完整展示出来 2
  • [课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习

    作者最近在复习考博 乘此机会分享一些计算机科学与技术 软件工程等相关专业课程考题 一方面分享给考研 考博 找工作的博友 另一方面也是自己今后完成这些课程的复习资料 同时也是在线笔记 基础知识 希望对您有所帮助 不喜勿喷 无知 乐观 低调 谦
  • 【Qt Modbus通信】QModbus实现modbus的主机功能 源码分享

    前言 modbus在上下位机数据交互时被广泛使用 因此写了这篇笔记和大家一起学习 Qt Modbus通信 libmodbus实现modbus的主机功能 从机功能 源码分享 之前使用libmodbus实现了modbus的主从功能 但发现主机查
  • docker frp 搭建内网穿透

    docker frp 搭建内网穿透 可运行的云服务器 docker pull snowdreamtech frps mkdir p root docker frp cd root docker frp touch frps ini comm
  • 企业微信如何简单实现定时发送文件到群:企业微信群机器人操作(Java代码实现)

    前言 不知道小伙伴们的公司组织架构通勤用的啥软件 我公司用的企业微信 然后业务销售部那边需要每天统计销售数据报表然后发在群里 我是开发 我不配在群里 知道这个背景以后 产品给我们的需求是 直接统计数据按照业务那边的报表模板直接生成销售报表
  • ARM-A架构入门基础(三)MMU

    14天学习训练营导师课程 周贺贺 ARMv8 ARMv9架构 快速入门 1 MMU Memory Management Unit 内存管理单元 MMU的意义在于将软件程序的虚拟地址转换为真实的物理地址 2 MMU种类 Secure EL1
  • 数据结构——图解循环队列长度计算问题

    队列定义是这样的 define MAXSIZE 10 typedef struct ElemType data MAXSIZE int front rear SeqQueue 一个队列 一个存放元素的数组 一个队头指针 一个队尾指针 fro
  • np.array与list的内存大小比较

    1 np array与list 比较 a 1 2 3 4 需要4个指针和四个数据 增加了存储和消耗cpu a np array 1 2 3 4 只需要存放四个数据 读取和计算更加方便 2 np array与list所占内存 def test
  • sqlserver语言转mysql_SQLSERVER 脚本转MYSQL 脚本的方法总结

    标签 1 MYSQL中SQL脚步都要以分号 结尾 这点比SQLSERVER要严谨 2 所有关键字都要加上 比如 Status 替换成 Status 按是有个 的键 3 SQLSERVER的dbo 在mysql中不支持 都要去掉 4 isnu
  • java field static_Java基础之关键字static

    static是Java中的一个关键字 用来修饰成员变量与成员方法 还可以用于编写静态代码块 对于被static修饰的东西 JVM在加载类的时候 就给这些变量在内存中分配了一定的空间 即在编译阶段时就为这些成员变量的实例分配了空间 一 静态变