探索Java中的静态变量与实例变量:存储区域、生命周期以及内存分配方式的区别
文章目录
🎉欢迎来到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 类都有哪些公共方法?
- equals(obj):判断其他对象是否“等于”此对象。
- toString():表示返回对象的字符串。通常,ToString方法返回一个“以文本方式表示”此对象的字符串。结果应该是一个简洁但信息丰富的表达,很容易让人阅读。建议所有子类都重写此方法。
- getClass():返回此对象运行时的类型。
- wait():表示当前线程进入等待状态。
- finalize():用于释放资源。
- notify():唤醒在该对象上等待的某个线程。
- notifyAll():唤醒在该对象上等待的所有线程。
- hashCode():返回对象的哈希代码值。用于哈希查找,可以减少在查找中使用equals的次数,重写equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
- 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外卖订购系统