Loading

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

接着上一章的代码:

 

//车类
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.

所以结果为;大众

 

posted @ 2015-08-18 23:19  脚本叔叔  阅读(194)  评论(0编辑  收藏  举报