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 改为 0x67
8. 最后输出c1.name c1拿着改后的地址去找地址为0x67的对象 输出为0x67地址的对象中的属性name.
所以结果为;大众
JAVA_SE基础——24.面向对象的内存分析相关推荐
- java知识点7——面向过程和面向对象、面向对象的内存分析、构造方法
面向过程和面向对象 解决简单问题可以使用面向过程 解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程. 面向对象具有三大特征:封装性.继承性和多态性,而面向过程没有继承性和多态性,并且面向 ...
- js基础练习---面向对象浅理解分析
function createPerson(name,sex,color) //构造函数 {var obj=new Object();//创建一个空对象 obj.name=name; obj.sex= ...
- Java(二)——简单的理解下面向对象内存分析
学习进入到面向对象初级阶段,看到代码的执行过程便很蒙圈.后来经同学指点告诉我说让我看看面向对象的内存分析,会对代码的理解有所帮助,这里就针对面向对象的内存分析进行阐述.(有些图和代码可能借助于网络和其 ...
- Java基础2面向对象和数组
第四章 Java面向对象基础 4.1 面向过程和面向对象 面向过程(Procedure Oriented)和面向对象(Object Oriented,OO)都是对软件分析.设计和开发的一种思想,它指导 ...
- 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)
菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...
- 6.面向对象,构造器,递归以及对象创建时内存分析(内含代码与练习)
面向对象的概念以及特征 概念 实质上将 "数据" 与 "行为" 的过程, 以类的形式封装起来, 一切以 对象 为中心的 面向对象的程序设计过程中有两个重要概念: ...
- Java面向对象05:创建对象的内存分析成员变量和局部变量的内存分析
一.创建对象内存分析 代码 public class Pet {//宠物类//类的属性public String name;//宠物名public int age ; //宠物年龄public Str ...
- Java基础-初识面向对象编程(Object-Oriented-Programming)
Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...
- golang 编写的在线redis 内存分析工具 rma4go
redis 内存分析工具 rma4go redis是一个很有名的内存型数据库,这里不做详细介绍.而rma4go (redis memory analyzer for golang) 是一个redis的 ...
最新文章
- [BUAA软工]提问回顾与个人总结
- 51Nod 1298 圆与三角形相交 计算几何
- php受保护的成员方法,PHP继承和受保护的成员可见性
- mysql查看锁表与解锁
- linux 文件权限后面一个点的含义
- vo listVO paggerHelper mapper使用原则
- 软件测试技术lab1 2017.3.13
- LIS (nlogn)的算法
- 0514JS函数练习
- 迈高图手机版_迈高图地图数据下载器
- Unity 接入旷视Face进行人脸融合
- oracle 正版识别,正版Oracle产品价格
- 大数据与云计算之间的关系
- arm开发板烧写linux系统,ARM开发板烧写linux系统的步骤
- OLAP 系统选型,选 Apache Kylin 还是 ClickHouse?
- python提升算法3_XGBOOST_docs_Scikit-LearnAPI_XGBClassifier_train参数01
- 数据可视化-Tableau-网店运营可视化分析
- 下班后可以做点什么副业赚钱呢?
- 原创 | GIS属性表转为Excel表格
- ORB-SLAM3中的词袋模型BoW
热门文章
- opencv及相机相关6
- charles修改响应体
- sqlserver操作geography方法
- 各类排序算法实现(亲测)
- 于我,过去,现在和未来 —— 西格里夫·萨松
- [开源]jquery.ellipsis根据宽度(不是字数)进行内容截断,支持多行内容
- JSON数据格式解析库(cJSON、Jansson)的使用在STM32上移植和使用
- 计算机怎么删除表格,电脑中删除Excel2010表格多余图片的三种方法
- BeanFactory和ApplicationContext有什么区别
- HTTPS与HTTP的一些区别