接着上一章的代码:

  1. //车类
  2. class Car{
  3.  
  4. //事物的公共属性使用成员变量描述。
  5. String name; //名字的属性
  6.  
  7. String color; //颜色属性
  8.  
  9. int wheel; //轮子数
  10.  
  11. //事物的公共行为使用函数描述。
  12. public void run(){
  13. System.out.println(name+"飞快的跑起来啦...");
  14. }
  15. }
  16.  
  17. class Demo1{
  18. public static void main(String[] args) {
  19. //使用了Car类声明了一c变量, c变量指向了一个车对象。
  20. Car c = new Car();
  21. //设置车对象的属性值。
  22. c.name = "BMW";
  23. c.color = "白色";
  24. c.wheel = 4;
  25. //访问车对象的属性值
  26. System.out.println("名字:"+ c.name+" 颜色:"+ c.color+" 轮子数:"+c.wheel);
  27. c.run();
  28. }
  29. }

结果是:

名字: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.

下面再看个例子:

  1. //车类
  2. class Car{
  3. //事物的公共属性使用成员变量描述。
  4. String name; //名字的属性
  5.  
  6. String color; //颜色属性
  7.  
  8. int wheel; //轮子数
  9.  
  10. //事物的公共行为使用函数描述。
  11. public void run(){
  12. System.out.println(name+"飞快的跑起来啦...");
  13. }
  14. }
  15.  
  16. class Demo1{
  17. public static void main(String[] args) {
  18. Car c1 = new Car();
  19. Car c2 = new Car();
  20. c1.name = "宝马";
  21. c2.name = "大众";
  22. System.out.println("名字:"+ c1.name);
  23. }
  24. }

结果:名字:宝马

  1.  

看下图解释:

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

所以结果是:宝马

下面再把这个例子改下:

  1. //车类
  2. class Car{
  3.  
  4. //事物的公共属性使用成员变量描述。
  5. String name; //名字的属性
  6.  
  7. String color; //颜色属性
  8.  
  9. int wheel; //轮子数
  10.  
  11. //事物的公共行为使用函数描述。
  12. public void run(){
  13. System.out.println(name+"飞快的跑起来啦...");
  14. }
  15. }
  16.  
  17. class Demo1{
  18. public static void main(String[] args){
  19. Car c1 = new Car();
  20. c1.name = "宝马";
  21. Car c2 = new Car();
  22. c2.name = "大众";
  23. c1 = c2;
  24. System.out.println("名字:"+ c1.name);
  25. }
  26. }

结果:大众

下图解释:

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_SE基础——25.面向对象练习

    黑马程序员入学blog ... 昨晚我写了篇面向对象的内存分析,今天我们来做个小练习.. 需求: 使用java描述一个车与修车厂两个事物, 车具备的公共属性:轮子数. 名字. 颜色 ,还 具备跑的功能 ...

  2. python基础(24):面向对象三大特性一(继承)

    1. 继承 1.1 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继 ...

  3. JAVA_SE基础——22.面向对象的概念

    我写博客是为了提升自己和为了进入黑马程序员学习,还有分享些自己的心得给大家,希望能帮助大家学习JAVA. 我是自学的,如果写的有错误或者能更好的修改的请提出. 在这里我先引用下<think in ...

  4. [转载]JAVA内存分析——栈、堆、方法区 程序执行变化过程

    面向对象的内存分析 参考:http://www.sxt.cn/Java_jQuery_in_action/object-oriented.html :尚学堂JAVA300集-064内存分析详解_栈_堆 ...

  5. 面向对象编程(十)——继承之Super关键字及内存分析

    Super关键字

  6. JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析

    转自:https://blog.csdn.net/tjiyu/article/details/53982412 1-1.为什么需要了解垃圾回收 目前内存的动态分配与内存回收技术已经相当成熟,但为什么还 ...

  7. Java面向对象内存分析

    title: Java面向对象内存分析 date: 2018-07-28 11:12:50 tags: JavaSE categories: - Java - JavaSE 一.Java虚拟机的内存区 ...

  8. python基础(内存分析,不引入第三方变量的方式交换变量的值)

    a,b指向同一块内存地址 下面方法是重新给b赋值;a,b指向不同的内存地址 字符串或int类型内存分析 不引入第三方变量的方式,交换a,b的值

  9. Java面向对象_对象内存分析—值传递和引用传递

    对象内存分析,我一直学的比较模糊,今天抽空整理一下,希望能理清. 先说一下,内存分析从何而来,这对于我们这些刚接触java的人来说都比较模糊,就从new关键字说起吧. new关键字表示创建一个对象或者 ...

随机推荐

  1. mysql__存储过程

    1.存储过程相当于我们学的各种高级语言的函数,既然是函数就可能有参数,先介绍参数类型: 存储过程主要包含三种参数类型,注意我说的不是数据类型(INT.VARCHAR) 第一种:IN输入参数:表示这种参 ...

  2. UML类图一

    转自:http://blog.csdn.net/lovelion/article/details/7838679 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统 ...

  3. Canvas 画布组件(官网翻译)

    Canvas画布 The Canvas is the area that all UI elements should be inside. The Canvas is a Game Object w ...

  4. linux修改时区

    Linux修改时区 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任 CentOS6: 查看以前的时区: [root@localhost mysq ...

  5. TensorFlow-谷歌深度学习库 体验一二三

    一个TensorFlow的运算可以看作是一个数据流图. 一个图呢则由一组操作和数据集组成. 操作(operation)代表运算单元 数据(tensor) 代表在各运算单元流动的数据单元 要想使用一个数 ...

  6. u-boot的SPL源码流程分析

    上次梳理了一下SPL的基本概念和代码总体思路,这次就针对代码跑的流程做个梳理.SPL中,入口在u-boot-spl.lds中 ENTRY(_start) SECTIONS { .text : { __ ...

  7. Ubuntu下sudo命令出现无法解析主机名

    替换hosts文件后sudo命令提示 无法解析主机名 把hosts文件中127.0.0.1后的名字改为主机名,即 /etc/hostname 中的名字

  8. Hashtable源码解析(JDK1.8)

    package java.util; import java.io.*; import java.util.concurrent.ThreadLocalRandom; import java.util ...

  9. 记录Window系统下myeclipes连接linux下mysql所出现的一个bug

    记录myeclipes远程连接mysql所出现的一个bug 今天在玩框架hibernate时,出现一个非常费解的bug,话不多说,先看bug Access denied for user 'root' ...

  10. 多个input连接在一起的时候如何实现输入一个数字跳入下一个

    这个是页面内容  ,我分了12格子,作为一个12位的会员卡号的输入;其实就是12个input我把他们放在了一个div里面  这样配上背景图,看着是一个大的输入框. <div id="A ...