文档章节

对象与对象引用

uknow8692
 uknow8692
发布于 2016/02/03 20:52
字数 1231
阅读 129
收藏 4

       如果分不清对象与对象引用,那实在没法很好地理解下面的面向对象技术,把自己的一点认识写下来,或许能让初学Java 的朋友们少走一点弯路。

        为便于说明,我们先定义一个简单的类:

 class student{  

  int name;  

  int age;  

  int sex;  

}

     有了这个类( 模板) ,就可以用它来创建对象:student stu1 = new student();

      通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作:

     1) 右边的"new student" ,是以student 类为模板,在堆空间里创建一个student 类的对象( 也简称为student 对象) 。

      2) 末尾的() 意味着,在对象创建后,立即调用student 类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java 会给你补上一个默认的构造函数。

      3) 左边的"student stu1" 创建了一个student 类引用变量。所谓student 类引用,就是以后可以用来指向某个student 对象的对象引用,它指向的是某个student 对象的内存地址( 有点C 语言中指针的味道) 。

      4)"=" 操作符使对象引用指向刚创建的那个student 对象。

      我们可以把这条语句拆成两部分:student stu1; stu1 = new student(); 效果是一样的。

      这样写,就比较清楚了,有两个实体:一是对象引用变量(stu1) ,在Sun 公司的实现中, 对象的引用是一个句柄, 其中包含一对指针: 一个指针指向该对象的方法表,一个指向该对象的数据;另一个是对象本身( 就是new 出来的那个对象) 。

     在堆空间里创建的实体,与在数据段以及栈空间里创建的实体不同。尽管它们也是确确实实存在的实体, 但是,我们看不见,也摸不着。不仅如此,我们仔细研究一下第二句,想想刚刚创建的student 对象叫什么名字?

      有人说,它叫"student" 。不对,"student" 是类( 对象的创建模板) 的名字。一个student 类可以据此创建 出无数个对象,这些对象不可能全叫"student" 。对象连名都没有,没法直接访问它。我们只能通过 对象引用来间接访问对象。

      为了形象地说明对象、对象引用及它们之间的关系,可以做一个或许不很妥当的比喻:

     对象好比是一只没有线的风筝,引用变量是一根线,可以用来系风筝。如果只执行了第一条语句, 还没执行第二条,此时创建的引用变量stu1 还没指向任何一个对象,它的值是null ,引用变量可以 指向某个对象,或者为null 。这时stu1 是一根线,一根还没有系上任何一个风筝的线。

      执行了第二句后,一只新风筝做出来了,并被系在stu1 这根线上。我们抓住这根线,就等于抓住了那只风筝。

      再来一句:student stu2; 就又做了一根线,还没系上风筝。如果再加一句:stu2=stu1; 系上风筝了。

      这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。

      结果是,stu2 也指向了stu1 所指向的对象,也就是两根线系的是同一只风筝。

      如果用下句再创建一个对象:stu2=new student(); 则引用变量stu2 改指向第二个对象。

      从以上叙述再推演下去,我们可以获得以下结论:

      (1) 一个对象引用可以指向0 个或1 个对象( 一根线可以不系风筝,也可以系一个风筝) ,而且可以改指;

      (2) 一个对象可以有N 个引用指向它( 可以有N 条线系同一个风筝) 。

      如果有下面语句:stu1=stu2;

      按上面的推断,stu1 也指向了第二个对象。这个没问题。问题是第一个对象呢?没有一条线系住它,它飞了。

      很多书里说,它被Java 的垃圾回收机制回收了,这不确切,准确地说,它已成为Java 垃圾回收机制的处理对象。

      至于什么时候真正被回收,那要看垃圾回收机制的心情了。由此看来,new student(); 该语句应该不合法吧,至少是没用的吧?不对,它是合法的,而且可用的。譬如,如果我们仅仅为了打印而生成一个对象, 就不需要用引用变量来系住它。最常见的就是打印字符System.out.println("I am Java!"); 字符串对象"I am Java!" 在打印后即被丢弃,有人把这种对象称之为临时对象。

© 著作权归作者所有

共有 人打赏支持
uknow8692
粉丝 17
博文 19
码字总数 6772
作品 0
武汉
程序员
Java 对象与垃圾回收

当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行...

Jansens
2016/12/09
14
0
云计算Python自动化:内部的引用计数

Python内部记录着所有使用中的对象有多少引用。一个内部跟踪变量,称为一个引用计数器。当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0时...

长沙千锋
05/16
0
0
Java问题系列:内存回收

Java内存的分配(创建Java对象)和回收(回收Java对象)构成了Java内存管理。 我们通过关键字new创建Java对象,JVM会在堆(heap)内存中为每个对象分配空间;当一个对象失去引用时,JVM的垃圾...

tequliapop
2015/12/22
140
0
Objective-C 管理对象图以避免内存泄漏

Objective-C 程序中的对象可构成对象图:即通过每个对象与其他对象的关系,或对其他对象的引用,而构成的一个对象网络。对象具有的引用可以是一对一或一对多(通过集对 象)。对象图很重要,...

cooper.z
2013/01/30
507
2
java中四种引用类型(对象的强、软、弱和虚引用)

对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1...

Freewheel
2015/09/27
520
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

day60-20180818-流利阅读笔记-待学习

钉钉:工作的归工作,生活的…也归工作? 毛西 2018-08-18 1.今日导读 你用过“钉钉”么?被公司要求使用钉钉的感受是如何的呢?这款阿里巴巴旗下的移动办公社交平台在弯道超车微信、为许多企...

aibinxiao
41分钟前
6
0
Kubernetes的HTTPS和证书问题,汇总

通过Kubernetes建立服务网站,需要干的事情和HTTPS和证书问题,汇总如下: 建立Nginx服务器 搞服务器第一步,Ubuntu 18.04设置静态IP 安装Nginx服务。 Kubernetes的deployment使用 创建服务,...

openthings
57分钟前
2
0
php 使用redis锁限制并发访问类

1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。 例如换领优惠券,如果用户同一时间并发提交换领...

豆花饭烧土豆
今天
0
0
Linux环境搭建 | 手把手教你配置Linux虚拟机

在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度。 Ubuntu刚安装完毕之后,还无法进行开发,...

良许Linux
今天
0
0
(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部