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关键字表示创建一个对象或者 ...
随机推荐
- sqlserver中压缩日志文件
最近在转移数据,sqlserver的日志文件ldf,占用空间特别大,为了还原库,节省空间,所以压缩日志文件迫在眉睫.在网上找了一段代码: USE [master] GO ALTER DATABASE ...
- python多线程、多进程以及GIL
多线程 使用threading模块创建线程 传入一个函数 这种方式是最基本的,即调用threading中的Thread类的构造函数,然后指定参数target=func,再使用返回的Thread的实例调 ...
- C#封装程序集属性方法注释说明
一.使用封装程序集好处: 在很多分布式应用程序开发中,针对每一种功能可能条用的接口不一样,往往习惯将需要被调用的接口,封装成DLL给调用方应用后使用,这样既规范了调用的方式,又避免了调用出现参数请求方 ...
- 如何在WordPress文本小工具中使用PHP
只需添加以下代码片段到你当前主题的functions.php文件 add_filter('widget_text', 'php_text', 99); function php_text($text) ...
- Java设计模式(五)Prototype原型模式
一.场景描述 创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理. 例如,在“仪器数据采集器”的子类/对象“PDF文件数据 ...
- go语言defer panic recover用法总结
defer defer是go提供的一种资源处理的方式.defer的用法遵循3个原则 在defer表达式被运算的同时,defer函数的参数也会被运算.如下defer的表达式println运算的同时,其入 ...
- Lombok介绍、使用方法和总结
1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how ...
- Intellij idea操作maven时控制台中文乱码
只留存记录 windows环境下,Intellij idea12中maven操作时,控制台中文乱码问题(编译报错或者clean install时出现的其他错误描述乱码) 在cmd中mvn中文正常显示, ...
- 小白学PYTHON时最容易犯的6个错误,看看你遇到过几个
最近又在跟之前的同学一起学习python,一起进步,发现很多测试同学在初学python的时候很容易犯一些错误,特意总结了一下.其实这些错误不仅是在学python时会碰到,在学习其他语言的时候也同样会碰 ...
- ngix_http_stub_status_module
1.ngx_http_stub_status_module 是一个 Nginx 的内置 HTTP 模块,该模块可以提供 Nginx 的状态信息.默认情况下这个模块是不被编译进来的,所以在编译 Ngin ...