接着上一章的代码:

//车类
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_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. node.js连接MySQL操作及注意事项

    node.js作为服务端的js运行环境已经出现了有几年了,最近我有个朋友也在做这方面的开发,但是也是刚刚接触,遇到了很多坑.前几天他们在操作数据库的时候出现了点问题,后来我们一起看了看,其实都是nod ...

  2. Spark2.1.0官方文档

    Spark 概述 Apache Spark是一个快速和通用的集群计算系统.它提供Java,scala,Python.R语言的APIs,以及支持一般执行图形的优化引擎. 它还支持一组丰富的高级工具,包括 ...

  3. 云计算之路-阿里云上:docker swarm 问题最新进展

    今天中午我们在 docker swarm 集群上发布应用时遇到了一个奇怪的 docker swarm 内置负载均衡的问题,该应用的 2 个新容器成功启动后,在容器内访问正常,但通过服务名访问时一会正常 ...

  4. WordPress菜单“显示选项”无法显示的解决办法

    比较新版本的WordPress会出现点击“外观”——“菜单”右上角的“显示选项”无法打开的问题,而老版本的就没有这个问题,后台的其他页面中的这个 功能都可以正常使用,看来问题是因为中文版WordPre ...

  5. Jmeter 相关资源

    官网:http://jmeter.apache.org/ 插件: https://jmeter-plugins.org

  6. Android工程化开发这门学科的看法

    http://www.cnblogs.com/unruledboy/p/DevCareer.html http://coolshell.cn/articles/4561.html http://blo ...

  7. canvas动画气球

    canvas小球的动画我用canvas画布实现的小球动画效果,可以参考下 我用canvas画布实现的小球动画效果,可以参考下 我用canvas画布实现的小球动画效果,可以参考下 我用canvas画布实 ...

  8. UnderScore.jsAPI记录

    Collection Functions (Arrays or Objects) each         _.each(list, iterator, [context]) 遍历list中的所有元素 ...

  9. [SDOI2010] 魔法猪学院

    Description 给定e和边权,求有多少条不同的道路能从1到n使得边权之和的和小于e Solution A*裸题 娘的要是SPFA再把dis写成to就剁手 // By YoungNeal #in ...

  10. 【jQuery】 JQ和AJAX

    AJAX AJAX全称异步 JavaScript 和 XML(Asynchronous JavaScript and XML),是一种用于网页前端和网站后台进行数据交互的手段.关于AJAX的详细介绍在 ...