探索Java中的静态变量与实例变量:存储区域、生命周期以及内存分配方式的区别

文章目录

    • 静态变量
    • 实例变量
    • 不可变对象
    • 静态变量和实例变量有什么区别?
      • 静态变量
      • 实例变量
    • Object 类都有哪些公共方法?
    • Java 创建对象有哪几种方式?
    • a==b 与 a.equals(b) 有什么区别?
    • 总结

在这里插入图片描述

🎉欢迎来到Java面试技巧专栏~探索Java中的静态变量与实例变量


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:Java面试技巧
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

在Java中,静态变量和实例变量是两种不同的变量类型,它们在存储区域、生命周期以及内存分配方式上存在显著的差异。

在这里插入图片描述

在这里插入图片描述

静态变量

静态变量,也被称为类变量,它们被声明为静态,并属于类本身,而不是类的实例。因此,无论类创建了多少个实例,静态变量都只有一份拷贝。静态变量存储在方法区,它们在类加载时被分配内存,并在程序运行期间一直存在,直到程序结束。

实例变量

实例变量,也被称为对象变量或非静态变量,它们属于类的每个实例。因此,每个实例都有其自己的实例变量的拷贝。实例变量存储在堆内存中,它们在创建对象时被分配内存,并在对象被垃圾回收时释放。

让我们通过一个简单的例子来理解这个概念:

public class Test {static int staticVar = 10; // 静态变量int instanceVar = 20; // 实例变量
}

在这个例子中,staticVar是一个静态变量,它属于Test类,而instanceVar是一个实例变量,它属于Test类的每个实例。

不可变对象

不可变对象是指对象一旦被创建,状态就不能再改变,任何修改都会创建一个新的对象。比如String、Integer及其它包装类。

不可变对象最大的好处是线程安全。
在这里插入图片描述

静态变量和实例变量有什么区别?

静态变量

静态变量是独立存在的变量,只是位置放在某个类下,可以直接类名加点调用静态变量名使用。并且是项目或程序一启动运行到该类时就直接常驻内存。不需要初始化类再调用该变量。用关键字static声明。静态方法也是同样,可以直接调用。

实例变量

相当于该类的属性,需要初始化这个类后才可以调用。如果这个类未被再次使用,垃圾回收器回收后这个实例也将不存在了,下次再使用时还需要初始化这个类才可以再次调用。

  • 存储区域不同:静态变量存储在方法区属于类所有,实例变量存储在堆当中;
  • 静态变量与类相关,普通变量则与实例相关;
  • 内存在分配方式不同。
  • 生命周期不同。

需要注意的是从静态变量在jdk7以后和字符串常量池一起存储在了堆中,JDK1.8开始用于实现方法区的PermSpace被MetaSpace取代。
在这里插入图片描述

Object 类都有哪些公共方法?

  1. equals(obj):判断其他对象是否“等于”此对象。
  2. toString():表示返回对象的字符串。通常,ToString方法返回一个“以文本方式表示”此对象的字符串。结果应该是一个简洁但信息丰富的表达,很容易让人阅读。建议所有子类都重写此方法。
  3. getClass():返回此对象运行时的类型。
  4. wait():表示当前线程进入等待状态。
  5. finalize():用于释放资源。
  6. notify():唤醒在该对象上等待的某个线程。
  7. notifyAll():唤醒在该对象上等待的所有线程。
  8. hashCode():返回对象的哈希代码值。用于哈希查找,可以减少在查找中使用equals的次数,重写equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
  9. clone():实现对象的浅复制,实现Cloneable接口才可以调用这个方法,否则抛出CloneNotSupportedException异常。
    在这里插入图片描述

Java 创建对象有哪几种方式?

创建对象 构造方法说明

  • 使用new关键字 调用构造方法
  • 使用Class类的newInstance方法 调用构造方法
  • 使用Constructor类的newInstance方法 调用构造方法
  • 使用clone方法 没有调用构造方法
  • 使用反序列化 没有调用构造方法
    在这里插入图片描述

a==b 与 a.equals(b) 有什么区别?

假设a和b都是对象,则a==b是比较两个对象的引用,只有当a和b指向的是堆中的同一个对象才会返回 true,而a.equals(b)是进行逻辑比较,当内容相同时,返回true,所以通常需要重写该方法来提供逻辑一致性的比较。

多数情况下需要重写这个方法,如String类重写equals()用于比较两个不同对象,但是包含的字母相同的比较:

public boolean equals(Object obj) {if (this == obj) {// 相同对象直接返回truereturn true;}if (obj instanceof String) {String anotherString = (String)obj;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;
}

在这里插入图片描述

总结

总结来说,静态变量和实例变量在Java中具有不同的存储区域、生命周期以及内存分配方式。理解这些差异对于优化程序性能、避免内存泄漏以及更好地理解Java的运行机制都是非常有帮助的。

🧸结尾


❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战<一>:打造高效便捷的企业级Java外卖订购系统

在这里插入图片描述

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

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

相关文章

详解RFC 793文档-3

3.4 建立连接 三次握手用来建立连接,这个过程通常由一个TCP发起,并由另一个TCP响应。如果两个TCP同时启动该过程,该过程也可以工作。这说明客户端和服务器可以同时发起连接请求,且能够连接成功。当同时尝试连接时,每个TCP在发送自己的SYN后接收到一个不携带任何ACK确认的…

汇编语言--操作系统入门

计算机真正能够理解的是低级语言,它专门用来控制硬件。汇编语言就是低级语言,直接描述/控制 CPU 的运行。如果你想了解 CPU 到底干了些什么,以及代码的运行步骤,就一定要学习汇编语言。 CPU 只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后…

vue+flask基于知识图谱的抑郁症问答系统

vueflask基于知识图谱的抑郁症问答系统 抑郁症已经成为当今社会刻不容缓需要解决的问题,抑郁症的危害主要有以下几种:1.可导致病人情绪低落:抑郁症的病人长期处于悲观的状态中,感觉不到快乐,总是高兴不起来。2.可导致工…

常见程序搜索关键字转码

个别搜索类的网站因为用户恶意搜索出现误拦截情况,这类网站本身没有非法信息,只是因为把搜索关键字显示在网页中(如下图),可以参考下面方法对输出的关键字进行转码 DEDECMS程序 本文针对Dedecms程序进行搜索转码&…

Apache Doris 2.0.0 版本正式发布:盲测性能 10 倍提升,更统一多样的极速分析体验

亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于 2023 年 8 月 11 日正式发布,有超过 275 位贡献者为 Apache Doris 提交了超过 4100 个优化与修复。 在 2.0.0 版本中,Apache Doris 在标准 Benchmark 数…

【微服务】一文了解 Nacos

一文了解 Nacos Nacos 在阿里巴巴起源于 2008 2008 2008 年五彩石项目(完成微服务拆分和业务中台建设),成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。 随着云计算兴起, 2018 2018 20…

创建一个 React+Typescript 项目

接下来 我们来一起探索一下用TypeScript 来编写react 这也是一个非常好的趋势,目前也非常多人使用 那么 我们就先从创建项目开始 首先 我们先找一个 或者 之前创建一个目录 用来放我们的项目 然后 在这个目录下直接输入 例如 这里 我想创建一个叫 tsReApp 的项目…

浅谈早期基于模板匹配的OCR的原理

基于模板匹配的概念是一种早期的字符识别方法,它基于事先准备好的字符模板库来与待识别字符进行比较和匹配。其原理如下: 1. 字符模板库准备:首先,针对每个可能出现的字符,制作一个对应的字符模板。这些模板可以手工创…

最新版本的Anaconda环境配置、Cuda、cuDNN以及pytorch环境一键式配置流程

本教程是最新的深度学习入门环境配置教程,跟着本教程可以帮你解决入门深度学习之前的环境配置问题。同时,本教程拒绝琐碎,大部分以图例形式进行教程。这里我们安装的都是最新版本~ 文章目录 一、Anaconda的安装1.1 下载1.2 安装1.3 环境配置…

日常BUG——使用Long类型作id,后端返回给前段后精度丢失问题

😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 数据库long类型Id: 前端返回的Id实体类: Data ApiModel("xxx") public class …

【C/C++】STL queue 非线程安全接口,危险!

STL 中的 queue 是非线程安全的,一个组合操作:front(); pop() 先读取队首元素然后删除队首元素,若是有多个线程执行这个组合操作的话,可能会发生执行序列交替执行,导致一些意想不到的行为。因此需要重新设计线程安全的…

【5款登录验证校验】基于jquery实现的5款登录验证码组件(附完整源码)

文章目录 写在前面涉及知识点1、随机字母验证码1.1 效果1.2 实现源码 2、数字运算验证码2.1 效果2.2 实现源码 3、滑块验证码3.1 效果3.2 实现源码 4、图片补全验证码4.1 效果4.2 实现源码 5、顺序点选验证码5.1 效果5.2 实现源码 6、源码分享6.1 百度网盘6.2 123网盘6.3 邮箱留…