static关键字详解——static与非static的区别

简介:       在本篇博客中,我主要会讲两个方面的内容,第一个是实例变量与类变量的区别,第二个是实例方法与类方法的区别。大家应该都知道,用static修饰的方法是类方法,用static修饰的变量是类变量。

      在本篇博客中,我主要会讲两个方面的内容,第一个是实例变量与类变量的区别,第二个是实例方法与类方法的区别。大家应该都知道,用static修饰的方法是类方法,用static修饰的变量是类变量。

 

1.实例变量与类变量的区别

       一个类通过使用new关键字可以创建多个不同的对象,这些对象将被分配不同的内存空间,说得准确些就是不同对象的实例变量将被分配不同的内存空间,如果类中有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量。也就是说,对象共享类变量。

 

      当Java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类中的实例变量不会被分配到内存。但是,类中的类变量 在类被加载到内存时,就分配了相应的内存空间。如果该类创建对象,那么不同对象的实例变量互不相同,即分配不同的内存空间,而类变量不再重新分配内存,所有对象共享类变量,即所有对象的类变量是相同的一处内存空间,类变量的内存空间直到程序退出运行,才释放所占有的内存。

 

      类变量是与类相关联的数据变量,也就是说,类变量是和该类创建的所有对象相关联的变量,改变其中一个对象的这个类变量就同时改变了其他对象的这个类变量。因此,类变量不仅可以通过某个对象访问,也可以直接通过类名访问。实例变量仅仅是和相应的对象关联的变量,也就是说,不同对象的实例变量互不相同,即分配不同的内存空间,改变其中一个实例变量不会影响其他对象的这个实例变量。实例变量只能通过对象来进行访问。

 

 

2.实例方法和类方法的区别

      类的方法分为实例方法和类方法两种,用static修饰的方法是类方法。当类的字节码被加载到内存的时候,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行,需要注意的是,当创建一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。

 

      对于类中的类方法,在该类被加载到内存时就已经被分配了入口地址,从而类方法不仅可以被类创建的任何对象调用,也可以直接通过类名进行调用。类方法的入口地址直到程序退出才被取消。

 

      类方法在类的字节码被加载到内存的时候就分配了入口地址,因此,Java允许直接通过类名来访问类方法,而实例方法则不能直接通过类名来访问。类中的类方法不可以操作实例变量,也不可以调用实例方法,就是因为在类创建对象之前,实例成员变量还没有分配内存,而实例方法也还没有入口地址。

 

      如果一个方法不需要操作实例变量就可以实现某种功能的话,那么这样的方法就应该声明为类方法。这样做可以避免创建对象浪费内存。

 

目录
相关文章
|
机器学习/深度学习 数据建模 数据挖掘
数据建模是什么意思?如何进行数据建模?
数据建模是什么意思?如何进行数据建模?
970 2
|
11月前
|
vr&ar 图形学 计算机视觉
突破次元壁!新加坡国立发布GenXD:拿捏真实感3D、4D动态场景
新加坡国立大学团队发布GenXD,突破3D和4D场景生成难题。通过利用常见相机和物体运动,提出数据整理管道及大型4D数据集CamVid-30K,开发出能生成逼真3D/4D场景的框架。其多视角-时间模块分离相机与物体运动,支持条件视图生成。尽管存在数据覆盖和复杂场景处理的挑战,GenXD仍显著提升了生成效果,为虚拟现实、游戏开发等领域带来新机遇。论文链接:https://arxiv.org/abs/2411.02319。
210 11
|
机器学习/深度学习 人工智能 算法
探索人工智能在图像处理中的应用
【10月更文挑战第32天】本文将深入探讨人工智能(AI)如何在图像处理领域大放异彩,从基础的图像识别到复杂的场景解析,AI技术正逐步改变我们对视觉信息的理解和应用。文章将通过具体案例,揭示AI如何优化图像质量、实现风格迁移和进行内容识别,进而讨论这些技术背后的挑战与未来发展方向。
698 1
|
机器学习/深度学习 物联网 数据处理
C语言用于物联网更合适还是python
选择 C 语言还是 Python 作为物联网(IoT)开发的语言取决于多个因素,包括项目的性质、资源限制、性能需求以及开发团队的技能水平。C 语言性能优越,适合资源受限的嵌入式设备,能直接访问硬件,广泛应用于底层开发,但开发复杂且容易出错。Python 则以其简单的语法和丰富的库支持快速开发和原型制作,适合跨平台应用和数据处理,但性能较低,资源占用较大。根据项目需求,性能和资源要求高时选择 C 语言,需快速开发和易于维护时选择 Python。
|
机器学习/深度学习 人工智能 缓存
基于AIGC的自动化内容生成与应用
基于AIGC的自动化内容生成与应用
556 3
|
传感器 监控 物联网
什么是物联网卡
物联网卡(IoT SIM卡)是专门为物联网设备提供网络连接的SIM卡,它在物联网技术中扮演着至关重要的角色。以下是对物联网卡的详细解释:
|
搜索推荐 数据安全/隐私保护
战斧指纹浏览器与IPXProxy海外代理IP配置详解
对于需要管理多个电商平台店铺的用户而言,战斧指纹浏览器提供了便捷的多账号隔离功能。跨境电商卖家要想在海外顺利的管理自己的店铺,还需要用到海外代理IP来实现IP隔离,确保店铺之间互相独立,不会受到其他店铺的牵连。下面以IPXProxy海外代理IP为例,给大家带来战斧指纹浏览器集成IPXProxy海外代理IP的详细指南。
613 0
Python实现用鼠标截图功能
Python实现用鼠标截图功能
|
分布式计算 Hadoop Linux
hadoop异常“could only be replicated to 0 nodes, instead of 1” 解决
异常分析  1、“could only be replicated to 0 nodes, instead of 1”异常 (1)异常描述 上面配置都正确无误,并且,已经完成了如下运行步骤: [root@localhost hadoop-0.
1987 0
|
存储 弹性计算 固态存储
NAS 入门与提高系列之如何在 Windows 下使用 NAS |学习笔记
快速学习 NAS 入门与提高系列之如何在 Windows 下使用 NAS
NAS 入门与提高系列之如何在 Windows 下使用 NAS |学习笔记