摘要:Hello,大家好呀!我是小米,一个29岁、爱分享技术的程序员。今天我来给大家聊聊在Java面试中经常被问到的一个“灵魂问题”——static的主要意义是什么?
Hello,大家好呀!我是小米,一个29岁、爱分享技术的程序员。今天我来给大家聊聊在Java面试中经常被问到的一个“灵魂问题”——static的主要意义是什么?
刚开始学习Java的小伙伴可能会觉得这个问题很简单,但如果你细细品味,就会发现它背后蕴藏着很多值得深挖的知识点。好了,话不多说,故事时间到!
有一次,我去参加一家知名互联网公司的社招面试,面试官看着简历笑着问我:“你知道static的作用吧?给我讲讲它为什么这么重要。”
我当时心里一紧,表面故作冷静,心想:这不是基础中的基础吗?不会是陷阱题吧?于是,我开始讲述自己对static的理解。
节省内存,提高性能为类提供共享资源方便调用,支持工具类和实用方法的实现接下来,我结合面试中的回答,逐一拆解给大家讲讲。
这是static的第一个重要意义。我们都知道,普通的实例变量和方法是属于对象的,每创建一个对象,就会分配一份独立的内存。而static修饰的变量和方法是属于类的,不会随着对象的创建而变化。
简单例子
运行结果
解释:
这里的counter是static变量,所有对象共享一份内存。无论创建多少个StaticDemo对象,counter的值都在原有基础上递增。如果不用static,每个对象都会有一个独立的counter变量,显然浪费内存,也无法实现我们统计对象个数的需求。为类提供共享资源还记得大学时大家抢电脑做编程作业的场景吗?我们需要一个公共的共享资源——电脑。同理,在编程中,有时候我们也需要多个对象共享某些资源,比如数据库连接池、配置文件路径等。
经典场景
用法:
这些static变量常用于配置常量的存储,因为它们:
全局唯一:static变量在类加载时初始化,所有地方都可以访问同一份资源。不可变性:通过final修饰符,保证数据安全。工具类中的应用
工具类如Math和Collections都广泛使用了static方法。试想一下,如果每次调用Math.sqrt都要先实例化一个Math对象,那岂不是效率极低?
在面试时,我特别强调了这一点,因为很多Java框架中都离不开static方法的支持。
单例模式的实现
你是不是听过单例模式(Singleton)?这是设计模式中的经典,用来保证某个类只有一个实例。static方法在这里的作用不可替代。
解释:
通过static方法getInstance,我们可以全局访问唯一的Singleton实例。如果不用static,就无法实现这种全局唯一的访问方式。在面试中,面试官又加了一问:“除了变量和方法,static还能做什么?”这时候我想到了静态代码块。
什么是静态代码块?
静态代码块用于初始化静态变量,在类加载时只执行一次。
运行结果
虽然static有很多优点,但也不是“万能钥匙”,在某些场景下需要慎用。
影响封装性:static变量是全局共享的,很容易被滥用,从而破坏类的封装性。不利于扩展性:静态方法无法被子类重写(不是多态的一部分)。如果你希望方法具有多态特性,请避免使用static。增加内存开销:如果static变量引用了大对象,并且类的生命周期很长,会导致不必要的内存占用。当我讲完这些内容后,面试官点了点头,说:“思路很清晰!不过,实际开发中,记住一条:static的意义在于明确职责,不要为了省事滥用,否则会带来维护成本。”
总结节省内存,提高性能:所有对象共享一份内存。为类提供共享资源:配置文件、工具方法等全局访问。方便调用,支持工具类和设计模式实现:如单例模式的全局访问点。静态代码块:在类加载时初始化静态变量,提升代码整洁度。在多线程环境下,static变量如何避免线程安全问题?
来源:待春天来到