欢迎来到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取代。
创建对象 构造方法说明
假设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外卖订购系统