首页 > 代码库 > JAVA_SE基础——24.面向对象的内存分析

JAVA_SE基础——24.面向对象的内存分析

黑马程序猿入学blog ...


接着上一章的代码:

//车类
class Car{
	
	//事物的公共属性使用成员变量描写叙述。

String name; //名字的属性 String color; //颜色属性 int wheel; //轮子数 //事物的公共行为使用函数描写叙述。 public void run(){ System.out.println(name+"飞快的跑起来啦..."); } } class Demo1{ public static void main(String[] args) { //使用了Car类声明了一c变量, c变量指向了一个车对象。

Car c = new Car(); //设置车对象的属性值。 c.name = "BMW"; c.color = "白色"; c.wheel = 4; //訪问车对象的属性值 System.out.println("名字:"+ c.name+" 颜色:"+ c.color+" 轮子数:"+c.wheel); c.run(); } }

结果是:

名字:BMW 颜色:白色 轮子数:4

BMW飞快的跑起来了



上面代码在内存中是怎么执行的呢?

以下我来给大家分析下:

技术分享

c是局部变量

1.先声明了c变量 分配在栈内存

2.new Car  在堆内存创建了一个车对象  看看Car有那些成员属性,然后再给对象分配初始值,为name=null。color=null。wheel=0     (成员一旦创建。对象的成员变量也会立即分配默认的初始值)  然后把地址0x97赋给了c       c就指向了车的这个对象。

3.

c.name  就是c拿着地址找到车的对象   然后把name改成BMW.       

c.color 就是c拿着地址找到车的对象   然后把color 改成白色.

c.wheel 就是c拿着地址找到车的对象   然后把wheel改成4.



以下再看个样例:

//车类
class Car{
	//事物的公共属性使用成员变量描写叙述。
	String	name; //名字的属性

	String	color; //颜色属性

	int wheel;	//轮子数
					
	//事物的公共行为使用函数描写叙述。

public void run(){ System.out.println(name+"飞快的跑起来啦..."); } } class Demo1{ public static void main(String[] args) { Car c1 = new Car(); Car c2 = new Car(); c1.name = "宝马"; c2.name = "大众"; System.out.println("名字:"+ c1.name); } }

结果:名字:宝马

看下图解释:技术分享

1.先声明了c1变量 分配在栈内存

2.new Car  在堆内存创建了一个车对象  看看Car有那些成员属性,然后再给对象分配初始值,为name=null,color=null。wheel=0    (成员一旦创建。对象的成员变量也会立即分配默认的初始值)  然后把地址0x97赋给了c1       c1就指向了车的这个对象。

3.再声明了c2变量 分配在栈内存

4.再new 一个 Car  在堆内存再创建了一个车对象  看看Car有那些成员属性。然后再给对象分配初始值。为name=null,color=null,wheel=0    (成员一旦创建,对象的成员变量也会立即分配默认的初始值)  然后把地址0x67赋给了c2       c2就指向了车的这个对象。

5.           c1.name  就是c1拿着地址找到车的对象   然后把name改成" 宝马 "    

6.           c2.name  就是c2拿着地址找到车的对象   然后把name改成“ 大众 ”

7.            最后输出c1.name            c1就拿着地址找到相应的对象  输出了那个对象的name  

所以结果是:宝马

以下再把这个样例改下:

//车类
class Car{
	
	//事物的公共属性使用成员变量描写叙述。
	String	name; //名字的属性

	String	color; //颜色属性

	int wheel;	//轮子数
					
	//事物的公共行为使用函数描写叙述。

public void run(){ System.out.println(name+"飞快的跑起来啦..."); } } class Demo1{ public static void main(String[] args){ Car c1 = new Car(); c1.name = "宝马"; Car c2 = new Car(); c2.name = "大众"; c1 = c2; System.out.println("名字:"+ c1.name); } }

结果:大众

下图解释:

技术分享

1.先声明了c1变量 分配在栈内存

2.new Car  在堆内存创建了一个车对象  看看Car有那些成员属性。然后再给对象分配初始值,为name=null,color=null,wheel=0    (成员一旦创建,对象的成员变量也会立即分配默认的初始值)  然后把地址0x97赋给了c1       c1就指向了车的这个对象。

3.           c1.name  就是c1拿着地址找到车的对象   然后把name改成" 宝马 "  

4.再声明了c2变量 分配在栈内存  

5.再new 一个 Car  在堆内存再创建了一个车对象  看看Car有那些成员属性,然后再给对象分配初始值。为name=null,color=null,wheel=0    (成员一旦创建。对象的成员变量也会立即分配默认的初始值)  然后把地址0x67赋给了c2       c2就指向了车的这个对象。

6.           c2.name  就是c2拿着地址找到车的对象   然后把name改成“ 大众 ”

7. 把c2的持有地址赋给了c1       c1的地址原来是0x97 改为 0x67    

8.  最后输出c1.name         c1拿着改后的地址去找地址为0x67的对象        输出为0x67地址的对象中的属性name.

所以结果为;大众

JAVA_SE基础——24.面向对象的内存分析