java 初识对象和对象引用的关系

news/2024/6/24 20:21:48

在接触java之前就知道了java的对象引用,但概念一直很模糊,看了《Head First in Java》后觉得书中的例子很有趣,便分享给大家。

首先要搞清对象引用是什么?

我们都知道变量可以存放数据,就像杯子一样,不同大小的杯子存放不同种类的饮料:

clipboard.png

clipboard.png

但是对象却是一类特殊的数据类型,在实例化一个对象时,是将对象分配到“堆”的存储空间的:

clipboard.png

而对象引用的作用就像“遥控器”一样去间接地指挥对象工作:

clipboard.png

对象与引用的“前世今生”

明白了上述概念后,就能简单通过下例搞明白,在对象创建过程中引用究竟和对象是怎样联系在一起的。
有如下实例:

clipboard.png

1、声明一个引用变量

Dog myDog = new Dog();

jvm(java虚拟机)分配空间给Dog类型的引用变量myDog,换言之,它是一个只能控制Dog的遥控器

clipboard.png

2、创建对象

Dog myDog = new Dog();
jvm分配堆空间给对象
clipboard.png

3、连接对象在和引用

Dog myDog = new Dog();
即设置遥控器控制的对象
clipboard.png

对象与引用的“恩恩怨怨”

引用在相互赋值,过程中,其实是对对象“控制权”的转让,没有人要的对象,就会被jvm检测到并清除。
有如下例:

1.

Book b = new Book();
Book c = new Book();

首先有这样两组对象与引用一一对应:

clipboard.png

2.

Book d = c;

新建一个Book引用变量d,并将c赋值给d,其结果为:c和d引用同一对象:

clipboard.png

3.

c = b;

将b的值赋值给c,其结果为:b和c引用同一对象

clipboard.png

4.

d = null;

将null赋值给d,表示它不引用任何事物;
而对象2由于没有人可以引用它,只能被当作垃圾回收:
clipboard.png

总结

这次看书基本明白了java引用和对象的关系,但我还想知道java为什么要这样设计。很遗憾,书中并没有具体说明,我只能通过我微不足道的经验谈谈自己的理解。
为了节省资源
java基本值传递,即拷贝传递,而拷贝引用显然比拷贝对象更省资源。
就像你拜托朋友照看房子,肯定是把钥匙的备份交给朋友,而非把房子的备份交给朋友。

clipboard.png


http://lihuaxi.xjx100.cn/news/235348.html

相关文章

iOS学习资源收集

目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与Toast 对话框 其他UI 动画 侧滑与右滑返回手势 gif动画 其他动画 网络相关 网络连接 图像获取 网络聊天 网络测试 WebView Model 通讯录 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像…

iOS应用版本更新(自动提醒用户)

在#import "AppDelegate.h" 文件中的application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 方法中调用检测结果 获得发布版本的Version 比较当前版本与新上线版本做比较 UIAlertView代理方法

Swift3.0带来的变化汇总系列一——字符串与基本运算符中的变化

var string "Hello-Swift" //获取某个下标后一个下标对应的字符 char"e" //swift2.2 //var char string[startIndex.successor()] //swift3.0 var char string[string.index(after: startIndex)] //获取某个下标前一个下标对应的字符 char2 "t&qu…

swift 3.0 json解析、字典转模型三种方案

swift3.0发布有一段时间了,发现很多朋友在swift3.0json解析上上遇到很多问题,我这边为大家提三种常见的json方案。 1.第一种是自带的字典转模型,自带的需要实现系统的setValue方法,然后自己还要实现dictToModel方法即可解析&…

Kotlin 开发Android app(十五):使用Broadcast收发广播

在上一章中,有个问题可能大家都没有注意,Acitivity 在使用startActivityForResult后,可以给另一个的Acitivity 或者Fragment 进行数据参数的传递,可以回去也可以回来。但如果中间要进行数据的交换,使用startActivityFo…

Swift之SDWebImage第三方框架

在学习Swift过程中,最害怕的使用了OC的第三方框架 好不容易配置成功了,却出现了意外的Bug [UIImageView setImageWithURL:]: unrecognized selector sent to instance解决办法 第一次配置的时候,因为百度了教程,所以一次性成功…

29款 Xcode 插件

iOS 应用构建工具xctool xctool 用以替换苹果公司的 xcodebuild 工具来简化 iOS 和 Mac 项目的构建和测试。要使用该工具必须安装 Xcode 命令行工具:From Xcode, install via Xcode → Preferences → Downloads....更多xctool信息 最近更新: xctool —…

iOS开发swift版异步加载网络图片(带缓存和缺省图片)

iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存。 异步加载图片的核心代码如下: func setZYHWebImage(url:NSStr…