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

news2024/10/5 23:51:22

文章目录

    • 静态变量
    • 实例变量
    • 不可变对象
    • 静态变量和实例变量有什么区别?
      • 静态变量
      • 实例变量
    • 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外卖订购系统

在这里插入图片描述

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

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

相关文章

Nacos详解(springcloud+nacos实战)

Nacos详解 Nacos1.介绍2.Nacos专业术语2.1 服务 (Service)2.2 服务注册中心 (Service Registry)2.3服务提供方 (Service Provider)2.4服务消费方 (Service Consumer)2.5版本依赖关系 Nacos 注册中心1. 启动NacosServer2 使用 Nacos 做注册中心2.1 nacos-client-b2.2 nacos-clie…

部门用户权限应用的设计和创建(进行中)

数据库表设计 代码实现之前首先是表设计, 六个基本步骤 1.需求分析 (分析用户需求,包括数据、功能和性能需求) 2.概念结构设计(主要采用 E-R图) 3.逻辑结构设计 (将ER图转换成表,实现从E-R模型到关系模型转换) 4.数据库物理设计 (为设计的…

深度学习的“前世今生”

1、“感知机”的诞生 20世纪50年代,人工智能派生出了这样两个学派,分别是“符号学派”及“连接学派”。前者的领军学者有Marvin Minsky及John McCarthy,后者则是由Frank Rosenblatt所领导。 符号学派的人相信对机器从头编程,一个…

Vue-5.编译器idea

关闭 IDEA 自动更新 IDEA无法搜索插件 填写idea下载插件的官方地址点击ok测试成功则ok https://plugins.jetbrains.com/idea 全局内存配置(重启后生效) 部署 Alibaba Cloud toolkit(部署代码的利器) Git(需要安装gi…

人工智能原理(4)

目录 一、确定性推理 1、推理方式 2、控制策略 二、推理的逻辑基础 1、永真和可满足性 2、等价性和永真蕴含 3、置换与合一 三、自然演绎推理 四、归结演绎推理 1、子句型 2、鲁滨逊归结原理 3、归结策略 一、确定性推理 推理:就是按照某种策略从已有事…

微机原理与接口技术 学习笔记(二) 存储器

文章目录 一,存储器1.1 概述1.1.1 半导体存储器的分类按制造工艺: 易失性或挥发性存储器 / 不易失性或不挥发性存储器按制造工艺: 1.1.2 半导体存储器的性能指标1.1.3 半导体存储器的一般结构及组成 1.2 随机存取存储器 RAM1.2.1 静态RAM1.2.…

操作符和表达式求值

目录 1.运算符的优先级和结合性 1.1运算符的优先级 1.2结合性 2.操作符的使用最终带来的是一个表达式的值 2.1.隐式类型转换(整型提升) 2.1.1整形提升的例子 2.2算术转换 1.运算符的优先级和结合性 运算符是编程语言中的基本元素之一,主…

临床试验三原则-对照、重复、随机

临床试验必须遵循三个基本原则:对照、重复、随机。 一、对照原则和对照的设置 核心观点:有比较才有鉴别。 对照组和试验组同质可比。 三臂试验 安慰剂:试验组:阳性对照组1:n:m(n≥m&#xff…

论文略读:城市道路场景下车辆编队运动规划与控制算法研究

1. 一些观点: (1)我曾经认为不能复现的论文都是垃圾。我现在看到能够量产的论文之后发现,论文的复现实属难得,即使给你代码,反复钻研,一个月之久才敢说略微看懂,所以论文的复现实在是…

使用 `tailwindcss-patch@2` 来提取你的类名吧

使用 tailwindcss-patch2 来提取你的类名吧 使用 tailwindcss-patch2 来提取你的类名吧 安装使用方式 命令行 Cli 开始提取吧 Nodejs API 的方式来使用 配置 初始化 What’s next? tailwindcss-patch 是一个 tailwindcss 生态的扩展项目。也是 tailwindcss-mangle 项目重要…

高等数学教材重难点题型总结(二)导数与微分

本章重点题目较少,除了*标题页没什么特别难的,本帖出于总结性的角度考虑并未囊概全部的*标,最后会出一期*标题的全部内容整理,在攻克重难点的基础上更上一层楼。 1.根据定义求某点处的导数值 2.通过定义证明导数 3.左右导数的相关…

QT使用QML实现地图绘制虚线

QML提供了MapPolyline用于在地图上绘制线段,该线段是实线,因此我使用Canvas自定义绘制的方式在地图上绘制线段,如图: 鼠标在地图上点击后,在点击位置添加图标 ,当有多个图标被添加到地图上后,计…

openGauss学习笔记-40 openGauss 高级数据管理-锁

文章目录 openGauss学习笔记-40 openGauss 高级数据管理-锁40.1 语法格式40.2 参数说明40.3 示例 openGauss学习笔记-40 openGauss 高级数据管理-锁 如果需要保持数据库数据的一致性,可以使用LOCK TABLE来阻止其他用户修改表。 例如,一个应用需要保证表…

MTK Android非常用分辨率修改充电动画

非标准分辨率的屏,配置MTK Android的关机充电动画. 环境 芯片 MTK 系统 Android 服务器 ubuntu 屏幕分辨率356*400,不是常见的分辨率. 原始充电动画显示异常,画面扭曲. 方法 确定使用的图片 vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo 这个目录下…

05-基础入门-系统及数据库等

基础入门-系统及数据库等 一、操作系统层面1、识别操作系统常见方法2、简要两者区别及识别意义3、操作系统层面漏洞类型对应意义4、简要操作系统层面漏洞影响范围 二、数据库层面1、识别数据库类型常见方法2、数据库类型区别及识别意义3、数据库常见漏洞类型及攻击4、简要数据库…

【【STM32之GPIO】】

STM32之GPIO 学完了正点原子自带的视频课之后感觉仍然一知半解现在更新一下来自其他版本的STM32学习 GPIO 就是 General Purpose Input Output 中文名叫通用输入输出口 可配置8种输入输出模式 引脚电平 0V~3.3V 部分引脚可容忍5V 输出模式下可控制端口输出高低电平&#xff…

MongoDB增删改查操作

数据库操作&#xff1a; 在MongoDB中&#xff0c;文档集合存在数据库中。 要选择使用的数据库&#xff0c;请在mongo shell程序中发出 use <db> 语句 // 查看有哪些数据库 show dbs;// 如果数据库不存在&#xff0c;则创建并切换到该数据库&#xff0c;存在则直接切换到…

CS5263 DP转HDMI 4k@60Hz转接线方案,替代IT6563 PS176方案

集睿致远/ASL推出的CS5263是一款DP转HDMI 2.0音视频转换芯片&#xff0c;主要用于设计DP转HDMI2.0音视频转换器或者DP转HDMI 4K60Hz音视频转接线等产品种适用于需要视频协议转换的电缆适配器、电视接收器、监视器和其他应用。 CS5263参数 DisplayPort输入&#xff08;接收器&a…

电脑如何快速查看系统中的驱动是否安装

第一步&#xff1a;winR 打开运行命令窗口 第二步输入&#xff1a;在打开输入框中输入driverquery&#xff0c;点击确定或按下回车键&#xff0c;命令行页面列出本机相关驱动信息。 1、driverquery 驱动查询 2、driverquery /V 驱动程序查询/ V

在 React+Typescript 项目环境中创建并使用组件

上文 ReactTypescript清理项目环境 我们将自己创建的项目环境 好好清理了一下 下面 我们来看组件的创建 组件化在这种数据响应式开发中肯定是非常重要的。 我们现在src下创建一个文件夹 叫 components 就用他专门来处理组件业务 然后 我们在下面创建一个 hello.tsx 注意 是t…