细谈 对象的初始化过程------内存中的实现过程?

今天对于内存的理解 又加深了一步:

对下面代码的理解:

class Person
{
	private String name="xiaohong";
	private int age=23;
	private static String country="CN";
	{
		System.out.println(name+"  "+age);
	}
	public Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public void setName(String name)
	{
	   this.name = name;
	}
	public String getName()
	{
		return this.name;
	}
}
class  Demo7
{
	public static void main(String[] args)
	{
		Person p = new Person("小白",20);
		p.setName("小黑");
	}
}

内存图解:  上图为证

总结:

内存是底层的真理! 如果,真正的理解了底层内存是怎么实现的,学任何一种语言都很简单!

因为,你掌握了 金钥匙!

下面是上面代码的运行时 加载过程:

1 JVM 启动类加载器,前篇介绍过!加载API 类库和扩展类库!之后加载我们程序中用的

类!例如: Demo7.class , person.class!

2  加载代码中的 静态代码块 static {} 对类 初始化

3  调用 Demo 中的 main 函数,进栈!

4  这个时候 Person    p = new Person()

在 对内存中 开辟内存空间,

5  对堆中的成员变量进行  默认初始化

6  对堆中的成员变量进行  显示初始化

7  执行构造 代码块! 对对象 初始化!

8  执行 构造方法!

9  将 对象的地址 赋值给 p!  ( 进栈! )

细谈 对象的初始化过程------内存中的实现过程?

时间: 2024-10-20 13:53:07

细谈 对象的初始化过程------内存中的实现过程?的相关文章

python中对象初始化放在内存中什么位置

截屏自<Python源码剖析>正文第一页. 也即: 当在其他class中使用 时,node是在堆中的.相当于在C中调用malloc. 不仅仅是对于像Node这样的class 的对象是存在于堆中的,在Python中就连int类型的数值同样是存在在堆中的.因为在Python中就连基本数据类型同样是对象. 让我们思考下Node中的value和self.value这两个变量: 为什么在Node中其他的方法能够调用self.value而不能够调用value? 以前我使用C/C++的思维方法来理解这个问题

浅谈对象的创建、内存布局和访问定位

在此简单的记录一下<深入理解Java虚拟机>第2章的2.3节内容. 对象的创建 这里的对象的创建是指普通的对象(不包括数组和Class对象).对象的创建简单来说就是执行new的时候,虚拟机做出对应的响应.让我们看看一下虚拟机创建对象的过程: 1.虚拟机遇到new指令时,首先尝试在常量池中定位到对应类的符号引用,并检查这个符号引用代表类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程(后续会写一下关于类加载的问题). 2.类加载检查通过后,为新生对象分配内存.对象内存的大小在

static修饰的静态变量与实例变量的区别,及其在初始化和内存中的运行机制详解

1. 静态变量的定义 静态变量(Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量. 说明:静态变量(用static修饰),它所被分配的空间是一直伴随程序运行的,空间将会保持到程序的结束关闭,才会被释放. 2.用static修饰的静态变量与普通变量的区别 假若在定义一个类的过程中,定义了一个static修饰的变量,那么这个类在被加载的同时,被static修饰的变量就存在于内存当中了,这样一来就独立于该类的所有对象,

一个对象在内存中产生的过程:

1.将该对象所需的类文件加载金内存 2.在内存进行空间的方法区的空间分配 3.通过new在对内存中开辟空间 4.对象中的属性进行默认初始化 5.调用与之对象的构造函数进行初始化 6.通过构造函数的super调用父类中的构造函数初始化 7.对象中的属性进行显示的初始化 8.构造代码块初始化 9.该构造函数内部自定义内容进行初始化

java成员变量和局部变量的初始化和内存中的运行机制

成员变量: 当系统加载类或创建类的实例时,系统会自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值. eyeNum是类属性.name是实例属性 所有person实例访问eyeNum都将访问person类的eyeNum属性.访问的是同一块内存.如果通过实例修改类属性,所有实例访问时都会改变. 局部变量: 局部变量定义后,必须经过显示初始化才能使用.这意味着定义了局部变量后,系统并未为这个变量分配内存空间,直到等到程序为这个变量赋值初始值时,系统才会给局部变量分配内存,并将初始

java复习第三天-局部变量的初始化和内存中的机制-this调用内存栈

定义了局部变量以后系统并不会为分配内存空间,显示初始化以后系统才会为其分配内存空间,保存在其所在栈的内存中. this调用另一个重载的构造器只能在构造器中使用,而且必须作为构造体的第一条 执行语句.

JavaScript 变量类型 保存内存中的位置 和 引用

1. JavaScript变量 基本类型值在内存中占据固定大小的空间 因此被保存在栈内存中. 从一个变量向另一个变量复制基本来下的值 会创建这个值得一个副本. 引用类型的值是对象 保存在堆内存中. 包含引用类型值得变量实际上包含的并不是对象本身 而是一个指向该对象的指针. 从一个变量向另一个变量复制引用类型的值 复制的其实是指针 因此两个变量最终都指向同一个对象 2. 堆和栈 堆栈在数据结构里面的含义就是一组数据的存放方式 后进先出 push: 在最顶层加入数据 pop: 返回并移除最顶层的数据

Java数组在内存中是如何存放的

阅读目录 一维数组 二维数组 数组对象及其引用存放在内存中的哪里? Java中有两种类型的数组: 基本数据类型数组: 对象数组: 当一个对象使用关键字“new”创建时,会在堆上分配内存空间,然后返回对象的引用,这对数组来说也是一样的,因为数组也是一个对象: 一维数组 int[] arr = new int[3]; 在以上代码中,arr变量存放了数组对象的引用:如果你创建了空间大小为10的整形数组,情况是一样的,一个数组对象所占的空间在堆上被分配,然后返回其引用: 二维数组 那么二维数组是如何存储

new一个JAVA对象的时候,内存是怎么分配的?

new 对象的时候 在内存中 建立一个 内存区域 就是堆内存 用来存放对象的属性,当new完对象把对象的地址赋给对象的引用变量 这个时候 又在内存中建立一个区域 叫栈内存 用来存储 引用变量 引用变量存储对象的地址, 当对象没有被任何引用变量 引用的时候 就变成了 垃圾会被java的垃圾清除机制清除掉