JAVA对象在内存中实例化的过程


        JAVA对象在内存中实例化的过程

在讲 Java 对象在内存中的实例化过程前,先来说下在类的实例化过程中,内存会使用到的三个区域:栈区堆区方法区

堆区: 存储的全部都是对象,每个对象包含了一个与之对应的 class 类的信息。 jvm 只有一个堆区(steap),它会被所有线程共享,堆中不存放基本数据类型和对象引用,它只存放对象本身。 栈区: 每个线程都包含一个栈区,栈中只保存基本数据类型的值和对象以及基础数据的引用。 每个栈中的数据(基本数据类型和对象的引用)都是私有的,其它栈是无法进行访问的。 栈分为三个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 方法区: 又被称为静态区,它跟堆一样,被所有的线程共享,方法区包含所有的 class 信息 和 static修饰的变量。 方法区中包含的都是整个程序中永远唯一的元素,如:class、static变量。

类实例化时内存中发生的变化

首先我们先对下面的代码进行分析:

public class People{
   String name; // 定义一个成员变量 name
   int age; // 成员变量 age
   Double height; // 成员变量 height
   void sing(){
       System.out.println("人的姓名:"+name);
       System.out.println("人的年龄:"+age);
       System.out.println("人的身高:"+height);
  }
   
   public static void main(String[] args) {
       String name; // 定义一个局部变量 name
  int age; // 局部变量 age
  Double height; // 局部变量 height
       
       People people = new People() ; //实例化对象people
       people.name = "张三" ;       //赋值
       people.age = 18;             //赋值
       people.stuid = 180.0 ;   //赋值
       people.sing();              //调用方法sing
  }
}

代码解析:

这段代码首先定义三个成员变量:String name、int age、Double height 这三个变量都是只声明了没有初始化,然后定义了一个成员方法 sing();

在 main()方法里同样定义了三个一样的变量,只不过这些是局部变量;

在main() 函数里实例化对象 people , 内存中在堆区内会给实例化对象 people 分配一片地址,紧接着我们对实例化对象 people 进行了赋值。people 调用成员方法 sing() 。mian()函数打印输入人的姓名,人的年龄和人的身高,系统执行完毕。

下面通过图解法展示实例化对象的过程中内存的变化

 

 

 

 

在程序的执行过程中,首先类中的成员变量和方法体会进入到方法区,如图:

 

 

程序执行到 main() 方法时,main()函数方法体会进入栈区,这一过程叫做进栈(压栈),定义了一个用于指向 Person 实例的变量 person。如图:

 

 

程序执行到 Person person = new Person(); 就会在堆内存开辟一块内存区间,用于存放 Person 实例对象,然后将成员变量和成员方法放在 new 实例中都是取成员变量&成员方法的地址值 如图:

 

 

接下来对 person 对象进行赋值, person.name = “小二” ; perison.age = 13; person.height= 180.0;

先在栈区找到 person,然后根据地址值找到 new Person() 进行赋值操作。

如图:

 

 

当程序走到 sing() 方法时,先到栈区找到 person这个引用变量,然后根据该地址值在堆内存中找到 new Person() 进行方法调用。

在方法体void speak()被调用完成后,就会立刻马上从栈内弹出(出站 )

最后,在main()函数完成后,main()函数也会出栈 如图:

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM