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.

所以结果为;大众

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值