JAVA_SE基础——24.面向对象的内存分析
Posted brucemengbm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 改为 0x678. 最后输出c1.name c1拿着改后的地址去找地址为0x67的对象 输出为0x67地址的对象中的属性name.
所以结果为;大众
以上是关于JAVA_SE基础——24.面向对象的内存分析的主要内容,如果未能解决你的问题,请参考以下文章