专业的JAVA编程教程与资源

网站首页 > java教程 正文

一文读懂Java对象从创建到销毁过程

temp10 2024-10-22 17:02:57 java教程 12 ℃ 0 评论

你是否了解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,因此它将被垃圾收集器标记为删除。该内存块将被释放以供其他进程使用。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表