JAVA_SE基础——24.面向对象的内存分析
接着上一章的代码:
//车类
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_SE基础——25.面向对象练习
黑马程序员入学blog ... 昨晚我写了篇面向对象的内存分析,今天我们来做个小练习.. 需求: 使用java描述一个车与修车厂两个事物, 车具备的公共属性:轮子数. 名字. 颜色 ,还 具备跑的功能 ...
- python基础(24):面向对象三大特性一(继承)
1. 继承 1.1 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继 ...
- JAVA_SE基础——22.面向对象的概念
我写博客是为了提升自己和为了进入黑马程序员学习,还有分享些自己的心得给大家,希望能帮助大家学习JAVA. 我是自学的,如果写的有错误或者能更好的修改的请提出. 在这里我先引用下<think in ...
- [转载]JAVA内存分析——栈、堆、方法区 程序执行变化过程
面向对象的内存分析 参考:http://www.sxt.cn/Java_jQuery_in_action/object-oriented.html :尚学堂JAVA300集-064内存分析详解_栈_堆 ...
- 面向对象编程(十)——继承之Super关键字及内存分析
Super关键字
- JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
转自:https://blog.csdn.net/tjiyu/article/details/53982412 1-1.为什么需要了解垃圾回收 目前内存的动态分配与内存回收技术已经相当成熟,但为什么还 ...
- Java面向对象内存分析
title: Java面向对象内存分析 date: 2018-07-28 11:12:50 tags: JavaSE categories: - Java - JavaSE 一.Java虚拟机的内存区 ...
- python基础(内存分析,不引入第三方变量的方式交换变量的值)
a,b指向同一块内存地址 下面方法是重新给b赋值;a,b指向不同的内存地址 字符串或int类型内存分析 不引入第三方变量的方式,交换a,b的值
- Java面向对象_对象内存分析—值传递和引用传递
对象内存分析,我一直学的比较模糊,今天抽空整理一下,希望能理清. 先说一下,内存分析从何而来,这对于我们这些刚接触java的人来说都比较模糊,就从new关键字说起吧. new关键字表示创建一个对象或者 ...
随机推荐
- git本地项目关联远程仓库
应用场景: 当你在开发一个项目的时候,不想只在本地存储,想用git来管理代码时候的. 1.在你的项目根目录打开git命令窗口,通过 git init 命令把这个目录变成Git可以管理的仓库: git ...
- 进程互斥 Peterson算法
转自http://blog.csdn.net/l294265421/article/details/46674847 假设有两个进程需要互斥的访问某一个临界区. Peterson算法的形式如下: en ...
- Java遍历二叉树深度宽度
节点数据结构 class TreeNode { TreeNode left = null; TreeNode right = null; } 最大深度,基本思路是:使用递归,分别求出左子树的深度.右子 ...
- Mimikatz的使用心得
Mimikatz是一款由法国人编写的轻量级调试工具,但更为人所知的是使用Mimikatz来获取Windows的明文密码. 这个软件的作者博客:http://blog.gentilkiwi.com/mi ...
- 如何彻底关闭windows update
对于我个人来说,我并不喜欢更新windows,打补丁对于我来说是一件没必要的事情,所以每次我装完系统之后的第一件事情就是在联网之前关闭windows更新,我通常是进去服务里面关闭,方法是win+R,然 ...
- 在Simplicity Studio下创建适用于EFR32的工程项目
1.使用平台 使用平台描述了在Simplicity Stdio下创建工程时所使用的操作系统与软件版本等. 操作系统:Windows 10 Simplcity Studio版本:Simlicity St ...
- 温故而知新--hashtable
哈希在实际使用中主要是当作私有内存,对数据进行插入和查找,哈希数据元素越多,操作的时候消耗的性能就越到,最明显的是当数据元素达到哈希的容量大小时,插入数据冲突概率会变大,并慢慢的退化为数组. 本例子中 ...
- jmeter--简单的接口测试(GET/POST)
最近在学习接口测试,本文就简单的谈一谈对接口相关知识的理解. 一.什么是接口? 程序接口:由一套陈述.功能.选项.其它表达程序结构的形式.以及程序师使用的程序或者程序语言提供的数据组成(百度百科定义) ...
- UVA 10305 Ordering Tasks(拓扑排序的队列解法)
题目链接: https://vjudge.net/problem/UVA-10305#author=goodlife2017 题目描述 John有n个任务,但是有些任务需要在做完另外一些任务后才能做. ...
- 微信小程序学习笔记(阶段二)
二阶段学习过程: (一)看官方文档的框架.组件.API:https://mp.weixin.qq.com/debug/wxadoc/dev/ (二)看极客学院第3.4章视频:http://www.ph ...