黑马程序猿入学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.面向对象的内存分析相关推荐

  1. java知识点7——面向过程和面向对象、面向对象的内存分析、构造方法

    面向过程和面向对象 解决简单问题可以使用面向过程 解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程. 面向对象具有三大特征:封装性.继承性和多态性,而面向过程没有继承性和多态性,并且面向 ...

  2. js基础练习---面向对象浅理解分析

    function createPerson(name,sex,color) //构造函数 {var obj=new Object();//创建一个空对象 obj.name=name; obj.sex= ...

  3. Java(二)——简单的理解下面向对象内存分析

    学习进入到面向对象初级阶段,看到代码的执行过程便很蒙圈.后来经同学指点告诉我说让我看看面向对象的内存分析,会对代码的理解有所帮助,这里就针对面向对象的内存分析进行阐述.(有些图和代码可能借助于网络和其 ...

  4. Java基础2面向对象和数组

    第四章 Java面向对象基础 4.1 面向过程和面向对象 面向过程(Procedure Oriented)和面向对象(Object Oriented,OO)都是对软件分析.设计和开发的一种思想,它指导 ...

  5. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

  6. 6.面向对象,构造器,递归以及对象创建时内存分析(内含代码与练习)

    面向对象的概念以及特征 概念 实质上将 "数据" 与 "行为" 的过程, 以类的形式封装起来, 一切以 对象 为中心的 面向对象的程序设计过程中有两个重要概念: ...

  7. Java面向对象05:创建对象的内存分析成员变量和局部变量的内存分析

    一.创建对象内存分析 代码 public class Pet {//宠物类//类的属性public String name;//宠物名public int age ; //宠物年龄public Str ...

  8. Java基础-初识面向对象编程(Object-Oriented-Programming)

    Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...

  9. golang 编写的在线redis 内存分析工具 rma4go

    redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个redis的 ...

最新文章

  1. [BUAA软工]提问回顾与个人总结
  2. 51Nod 1298 圆与三角形相交 计算几何
  3. php受保护的成员方法,PHP继承和受保护的成员可见性
  4. mysql查看锁表与解锁
  5. linux 文件权限后面一个点的含义
  6. vo listVO paggerHelper mapper使用原则
  7. 软件测试技术lab1 2017.3.13
  8. LIS (nlogn)的算法
  9. 0514JS函数练习
  10. 迈高图手机版_迈高图地图数据下载器
  11. Unity 接入旷视Face进行人脸融合
  12. oracle 正版识别,正版Oracle产品价格
  13. 大数据与云计算之间的关系
  14. arm开发板烧写linux系统,ARM开发板烧写linux系统的步骤
  15. OLAP 系统选型,选 Apache Kylin 还是 ClickHouse?
  16. python提升算法3_XGBOOST_docs_Scikit-LearnAPI_XGBClassifier_train参数01
  17. 数据可视化-Tableau-网店运营可视化分析
  18. 下班后可以做点什么副业赚钱呢?
  19. 原创 | GIS属性表转为Excel表格
  20. ORB-SLAM3中的词袋模型BoW

热门文章

  1. opencv及相机相关6
  2. charles修改响应体
  3. sqlserver操作geography方法
  4. 各类排序算法实现(亲测)
  5. 于我,过去,现在和未来 —— 西格里夫·萨松
  6. [开源]jquery.ellipsis根据宽度(不是字数)进行内容截断,支持多行内容
  7. JSON数据格式解析库(cJSON、Jansson)的使用在STM32上移植和使用
  8. 计算机怎么删除表格,电脑中删除Excel2010表格多余图片的三种方法
  9. BeanFactory和ApplicationContext有什么区别
  10. HTTPS与HTTP的一些区别