网站首页 > java教程 正文
你是否了解Java中创建类的对象会发生什么?当对象使用完毕后,谁会删除该对象?在本文中将举例说明整个对象从创建到销毁的过程。
示例代码:
public class Student {
private int stuentNumber;
private String name;
public int getStuentNumber() {
return stuentNumber;
}
public void setStuentNumber(int stuentNumber) {
this.stuentNumber = stuentNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class App
{
public static void main( String[] args )
{
Student s1 = new Student();
s1.setStuentNumber(10);
s1.setName("John");
System.out.println(s1.getStuentNumber());
System.out.println(s1.getName());
System.out.println("------------");
Student s2 = s1;
s2.setName("Sam");
System.out.println(s1.getStuentNumber());
System.out.println(s1.getName());
System.out.println(s2.getStuentNumber());
System.out.println(s2.getName());
}
}
在上面的示例中,我们创建了一个 Student 类,其中包含两个变量:学号和姓名。每个变量都有其相应的 setter 和 getter 方法来修改它们的值并访问它们的当前值。在App类中,我们有main方法,它首先创建一个Student对象“s1”,然后调用setter方法将学号的值设置为10,将姓名设置为“John”。接下来,打印 s1 的学号和姓名的值。随后,我们创建 s2 并将 s1 的值分配给 s2。接下来,我们将 s2 上的姓名修改为“Sam”。然后我们打印 s1 和 s2 的学号和姓名。
程序输出:
10
John
------------
10
Sam
10
Sam
现在让我们详细研究一下对象的创建和删除过程! Java 程序的执行从将 main 函数加载到堆栈开始。然后它依次执行每条指令。在我们的例子中,执行从第 30 行开始。
Student s1 = new Student()
这里,使用 new 关键字在堆上,为 Student 类型分配内存。内存块包括 int (stuentNumber) 和 String (name) 的空间。下面是直观的表示,假设分配块的内存地址是 1000。
s1 是一个只能存储内存地址的引用变量,并使用点 (.) 运算符来访问地址 1000 处的内存块的学号和姓名。第 #31 行和 #32 行设置学号和姓名的值位于s1指向的内存块处。执行这些行后,变化如下所示:
在第 #33和 #34 行,我们请求打印 s1 引用的内存块(即地址为 1000 的内存块)中存储的学号和姓名的值。下面是执行 # 33、#34、#35行后的程序输出:
10
John
------------
在第 #37 行,我们创建了另一个引用变量 s2,并将其值指定为 s1 的值,即将值 1000 指定给 s2。
请注意,s1 和 s2 现在都引用相同的内存块!因此,任何通过这些引用变量所做的更改都会影响同一内存块。在第 #38 行,s2 修改存储在内存块 1000 中的姓名值。因此,内存位置 1000 处的值从“John”更改为“Sam”。
在第 #39 和 #40 行,我们请求打印存储在 s1 引用的内存位置的学号和姓名的值,即 1000。
10
John
------------
10
Sam
最后,在第 #41 行和第 #42 行,我们请求打印存储在 s2 引用的内存位置的学号和姓名的值,即 1000。
10
John
------------
10
Sam
10
Sam
在第 #42 行之后,由于没有更多的指令可供执行,因此 main 方法将从堆栈中删除,并且程序的执行停止。由于程序的任何部分都没有主动引用内存块 1000,因此它将被垃圾收集器标记为删除。该内存块将被释放以供其他进程使用。
- 上一篇: #逻辑删除(#逻辑删除和物理删除的区别)
- 下一篇: Redis的过期键删除策略和数据逐出策略
猜你喜欢
- 2024-10-22 「是时候升级Java11了」 JDK11优势和JDK选择
- 2024-10-22 一文读懂关于Java如何找出两个列表之间的新增和删除元素
- 2024-10-22 JAVA 面试高频提问知识点之:SET、LIST 和 MAP 的区别
- 2024-10-22 Java常规操作新增,更新,删除(java常规操作新增,更新,删除什么意思)
- 2024-10-22 JAVA全栈CMS系统Vue无限级分类拖拽增改查批量删除7
- 2024-10-22 「LeetCode」删除字符串中的所有相邻重复项Java题解
- 2024-10-22 sed命令之删除匹配行的详细介绍(sed命令删除指定内容范围)
- 2024-10-22 # Redis 入门到精通(七)-- redis 删除策略
- 2024-10-22 【Java面试题】List如何一边遍历,一边删除?
- 2024-10-22 Redis03——Redis是如何删除你的数据的
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)