Java基础-对象的内存分配与初始化(一定要明白的干货)

摘要:
Java虚拟机为每种类型管理一个唯一的Class对象。对象内存分配和初始化[java]viewplaincopyprint?构造方法被推入堆栈,对象被初始化。初始化后,弹出堆栈。对象已创建。

首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象。Java虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。一旦某个类的Class对象被载入到内存,他就被用来创建这个类的所有对象。

类的加载会发生在什么时候呢?所有的类都是在其第一次使用的时候,动态加载到JVM的。当程序创建第一个对类的静态成员的引用时,就会加载这个类。构造方法默认也是静态的,所以new的时候若该类未被加载,则也会进行加载操作。

另外说明下,有继承体系的类也会被自动加载,不管该父类是否会被使用。比如B继承了A。倘若任何类都未被加载,当 new B() 时,首先会将B加载了,随后会将A给加载了。

对象的内存分配及初始化

[java] view plain copy
 
 print?
  1. public class Demo_Student {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Student s = new Student();  
  5.         s.show();  
  6.     }  
  7.   
  8. }  
  9.   
  10. class Student {  
  11.     private String name = "张三";  
  12.     private int age = 23;  
  13.     public Student() {  
  14.         name = "李四";  
  15.         age = 24;  
  16.     }  
  17.     public void show() {  
  18.         System.out.println("我叫:"+name+",今年"+age+"岁");  
  19.     }  
  20. }  



1.首先,程序运行时,会将Demo_Student加载进内存,随后,其主方法main入栈。紧接着发现了new Student(),所以又将Student加载进内存

字段信息:存放类中声明的每一个字段的信息,包括字段的名、类型、修饰符。

方法信息:类中声明的每一个方法的信息,包括方法名、返回值类型、参数类型、修饰符、异常、方法的字节码。

Java基础-对象的内存分配与初始化(一定要明白的干货)第1张

2.然后在栈内存分配一块空间(Student s),声明Student的引用。new Studetn() 在堆内存开辟空间,进行默认初始化和显示初始化

Java基础-对象的内存分配与初始化(一定要明白的干货)第2张

3.调用构造方法,系统默认调用。构造方法进栈,对对象进行初始化,初始化完成后,弹栈。此时对象已经创建完毕。将其地址值赋值给变量s

Java基础-对象的内存分配与初始化(一定要明白的干货)第3张

4.可通过s其地址值找到对应堆内存空间的实体,调用show方法时,show进栈,其内部有个隐藏的this引用,根据该引用找到堆内存实体,并打印相应内容

Java基础-对象的内存分配与初始化(一定要明白的干货)第4张

5.随后main方法也执行完毕,弹栈,程序执行完毕

总结

Student s = new Student(); 在内存中到底执行了哪些步骤?

1,加载Sutdent.class文件进内存(类加载器)

2,在栈内存为 s 变量申请一个空间

3,在堆内存为Student对象申请空间

4,对类中的成员变量进行默认初始化

5,对类中的成员变量进行显示初始化

6,有构造代码块就先执行构造代码块,如果没有,则省略(此步上文未体现)

7,执行构造方法,通过构造方法对对对象数据进行初始化

8,堆内存中的数据初始化完毕,把内存值复制给 s 变量

免责声明:文章转载自《Java基础-对象的内存分配与初始化(一定要明白的干货)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql(2)—— 由笛卡尔积现象分析数据库表的连接wireshark数据包分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法

Adobe flash cs5 的Java运行时环境初始化错误 完美解决方法 下载网络上的Adobe flash cs5 精简版(绿色版),Java运行时环境初始化时出现错误,你可能需要重装Flash。 adobe cs 5的java运行时(Runtime)放到windows公共目录下面了。 因为adobe 有很多的产品用到了java Runtime 运行...

iOS 启动时间优化

在 WWDC 2016 上首次提到了关于 App 应用启动速度优化的话题:Session 406 Optimizing App Startup Time。 一、冷启动与热启动 热启动是,APP会恢复之前的状态继续运行,这种就是热启动,我们平时所说的APP在后台的存活时间,其实就是APP能执行热启动的最大时间间隔。而冷启动则是APP从被加载到内存到运行的状态...

Android编译系统环境过程初始化分析【转】

本文转载自:http://blog.csdn.net/luoshengyang/article/details/18928789  Android源代码在编译之前,要先对编译环境进行初始化,其中最主要就是指定编译的类型和目标设备的型号。Android的编译类型主要有eng、userdebug和user三种,而支持的目标设备型号则是不确定的,它们由当前的源码...

Win32汇编_变量

Win32汇编_变量全局变量:全局变量的作用域是整个程序,Win32汇编的全局变量定义在.data或.data?段内,可以同时定义变量的类型和长度.格式是:变量名类型初始值1, 初始值2, …变量名类型重复数量 dup (初始值1, 初始值2, …)例:.data;全局变量的类型才可以用缩写wHour dw ? ;未初始化的word类型变量wMinute...

[Java] SpringMVC工作原理之一:DispatcherServlet

一、DispatcherServlet 处理流程 在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作。在看 DispatcherServlet 类之前,我们先来看一下请求处理的大致流程: Tomcat 启动,对 DispatcherServlet 进行实例化,然后调用...

Java多线程:向线程传递参数的三种方法

在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果。但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据。本文就以上原因介绍了几种用于向线程传递数据的方法...