探索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) {// 相同对象直接返回true
        return 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外卖订购系统

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贝锐蒲公英:快速搭建连锁门店监控体系,赋能企业高效管理

随着国民生活水平的提高和零售场景的变革,消费者对于餐饮类目的消费支出不断增加,线下社区生鲜商超作为下沉市场最主要的消费场景之一,蕴藏着巨大价值机会。 对于线下连锁生鲜超市而言,连锁门店多、员工多,门店管理时会…

如何使用CSS实现一个响应式网格布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现响应式网格布局⭐ 设置基本的HTML结构⭐ 创建基本的CSS样式⭐ 添加媒体查询以实现响应式效果⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端…

【Vue-Router】路由传参

1. query 传参 list.json {"data": [{"name": "面","price":300,"id": 1},{"name": "水","price":400,"id": 2},{"name": "菜","price":500,"…

C#质检工具(StyleCop、SonarLint)

1、StyleCop StyleCop工具主要类似java中的checkStyle,是检查代码样式规范的工具。 1.1、StyleCop安装流程: 图1.1 图1.2 图1.3 安装StyleCop插件时可能会遇到下载特慢或卡住不动的情况,需注意: 1)网上说的关闭IPV6功能不管用 2)网上说的自动指定dns不管用 3)网上…

Qt应用开发(基础篇)——滚屏区域基类 QAbstractScrollArea

一、前言 QAbstractScrollArea滚屏区域抽象类继承于QFrame,QFrame继承于QWidget,是QListview(列表浏览器)、QTableview(表格浏览器)、QTextEdit(文本编辑器)、QTextBrowser(文本浏览器)等所有需要滚屏区域部件的抽象基类。 框架类QFrame介绍 QAbstractSc…

软件工程概述-架构师(三)

软件工程概述(老版) 软件开发生命周期: 软件定义时期:包括 可行性研究和详细需求分析过程,任务是软件工程必需完成的目标,具有可行问题分析、可行性研究、需求分析等。软件开发时期:软件的 设…

11 - git stash 开发中临时加塞了紧急任务怎么处理

查看所有文章链接:(更新中)GIT常用场景- 目录 文章目录 开发中临时加塞了紧急任务怎么处理 开发中临时加塞了紧急任务怎么处理 当你此时工作区已经修改了 Readme 文件,然后突然需要解决其他问题(紧急问题、新任务&…

HbuildX生成安卓签名证书

HbuildX生成安卓签名证书 安装和配置JRE环境 根据此链接安装和配置JRE环境 生成签名证书 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystoretestalias是证书别名,可修改为自己想设置的字符,建议…

Java旋转数组中的最小数字(图文详解版)

目录 1.题目描述 2.题解 分析 具体实现 方法一(遍历): 方法二(排序): 方法三(二分查找): 1.题目描述 有一个长度为 n 的非降序数组,比如[1,2,3,4,5]&a…

深入了解电脑硬件以及多线程编程

文章目录 认识计算机硬件与多核CPU的工作原理单核CPU多核CPU并发与并行 深入了解进程、线程及其优先级进程与线程线程的创建与命名线程的优先级与控制线程的休眠与等待 线程安全与锁机制同步与异步线程安全问题与锁可重入锁解决线程安全问题 多线程间的通信与线程池的使用线程通…

无涯教程-Perl - select函数

描述 此函数将输出的默认文件句柄设置为FILEHANDLE,如果未指定文件句柄,则设置由print和write等功能使用的文件句柄。如果未指定FILEHANDLE,则它将返回当前默认文件句柄的名称。 select(RBITS,WBITS,EBITS,TIMEOUT)使用指定的位调用系统功能select()。 select函数设置用于处理…

每天一道leetcode:1129. 颜色交替的最短路径(图论中等广度优先遍历)

今日份题目: 给定一个整数 n,即有向图中的节点数,其中节点标记为 0 到 n - 1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges,其中: redEdges[i] [ai, bi…

创建Azure资源锁

锁的介绍 在Azure中,资源锁是一种用于保护订阅、资源组或者单个资源的机制。它可以防止对受锁定的资源进行删除或修改操作,帮助确保资源的连续可用性和安全性。 Azure中的资源锁可以分为两种类型: 删除锁(CanNotDelete&#xf…

el-table自适应缩放大小

安装依赖 npm install --save vue-draggable-resizable //或 cnpm install --save vue-draggable-resizablemain.js引入依赖 import VueDraggableResizable from vue-draggable-resizable import "vue-draggable-resizable/dist/VueDraggableResizable.css"; Vue.c…

linux中的/dev/null

1.什么是/dev 在 Linux 上,从驱动程序到设备的所有内容都可以作为文件进行访问。/dev/ 是包含所有物理和虚拟设备的目录。例如,/dev/sda 可能是您的主硬盘驱动器,/dev/sdb 可能是您现在正在使用的笔记本驱动器的文件。这就是您在 Linux 中访问…

原子css 和 组件化css如何搭配使用

如果让你来实现下面这种页面,该怎么实现呢 原子化和css组件化方式写法,可以搭配起来使用,常用的css 原子css 比如 下面这些类似flex 布局,lstn curser-pointer 等常用的或者 具备一定规律性的padding margin 样式可以抽取为单独…

KubeSphere 部署 Zookeeper 实战教程

前言 知识点 定级:入门级如何利用 AI 助手辅助运维工作单节点 Zookeeper 安装部署集群模式 Zookeeper 安装部署开源应用选型思想 实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不同) 主机名IPCPU内存系统盘数据盘用途ks-master-0192.168.9.9…

【maven】通过profiles实现:怎样激活某个仓库、同时加载多个profile、不同环境加载不同依赖jar

文章目录 一. 基本用法二. 仓库激活方式1. 使用activeProfile激活2. 使用-P参数激活3. 使用-P参数不激活 三. 查看激活的仓库四. 不同环境依赖不同版本的jar Maven中的profile是一组可选的配置,可以用来设置或者覆盖配置默认值。有了profile,你就可以为不…

【elementUi】绘制自定义表格、绘制曲线表格

要求绘制下图系列表格: 实现步骤: 1.绘制树,实现树勾选字段—>表格绘制字段 逻辑: 树:check-change“treeChart.handleCheckChange” 绑定点击选择事件,改变data.column3数据项;表格:columns"data…

问AI一个严肃的问题

chatgpt的问世再一次掀起了AI的浪潮,其实我一直在想,AI和人类的关系未来会怎样发展,我们未来会怎样和AI相处,AI真的会完全取代人类吗,带着这个问题,我问了下chatgpt,看一看它是怎么看待这个问题…