文档章节

对象与对象引用

uknow8692
 uknow8692
发布于 2016/02/03 20:52
字数 1231
阅读 129
收藏 4
点赞 1
评论 0

       如果分不清对象与对象引用,那实在没法很好地理解下面的面向对象技术,把自己的一点认识写下来,或许能让初学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
粉丝 15
博文 17
码字总数 6433
作品 0
武汉
程序员
[转]Java 强引用、 软引用、 弱引用、虚引用

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

mj4738 ⋅ 2012/07/08 ⋅ 2

Objective-C 管理对象图以避免内存泄漏

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

cooper.z ⋅ 2013/01/30 ⋅ 2

Java问题系列:内存回收

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

tequliapop ⋅ 2015/12/22 ⋅ 0

Java 对象与垃圾回收

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

Jansens ⋅ 2016/12/09 ⋅ 0

java中四种引用类型(对象的强、软、弱和虚引用)

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

Freewheel ⋅ 2015/09/27 ⋅ 0

android,性能优化,内存优化管理,高级缓存

这近做的项目老是出现内存溢出,项目一大,稍不注意就会出现这样 的问题。导致第二个版本框架重写,重要的还是继承体系过深,导致垃圾回收总是回收不了,最后导致内存沾满无法释放。 内存对于...

迷途d书童 ⋅ 2012/03/26 ⋅ 0

云计算Python自动化:内部的引用计数

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

长沙千锋 ⋅ 05/16 ⋅ 0

Android上C++对象的自动回收机制分析

1. 背景 C++没有像Java那样的内建的对象自动回收机制,new创建的对象没有delete,会一直存在于内存中。对象已经不再使用,但是如果忘记 delete,会造成内存资源的泄露。在实际开发过程中,分...

阿酷 ⋅ 2011/12/26 ⋅ 0

JAVA中的强引用、弱引用、软引用、虚引用

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

向阳而生 ⋅ 2015/11/16 ⋅ 0

【J2SE】认识变量

一、前言: Java的数据类型有两种:一种是基本数据类型,一种是引用类型。Java变量分为局部变量、成员变量(实例变量)、静态变量(类变量)。 二、变量必须拥有类型和名称。 三、对象的声明...

qq_26545305 ⋅ 2016/11/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

关于“幂等”操作

一个幂等(idempotent)操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同. 开发中, 我们经常考虑幂等操作的场景有“接口调用”、“MQ消费”、“自动任务”等 接口调用, 可能出现...

零二一七 ⋅ 15分钟前 ⋅ 0

Dubbo服务服务暴露之ProxyFactory Invoker

Dubbo服务暴露过程中有涉及到调用ProxyFactory 中方法获取Invoker对象的过程,现在我们来深究下源码,来看下这个过程是在做些什么,返回的Invoker 对象是什么,我们来看一下代码的切入点: ...

哲别0 ⋅ 29分钟前 ⋅ 0

GP两种连接方式性能测试

GP两种连接方式性能测试 Pivotal import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class GPQueryStrin......

仔仔1993 ⋅ 34分钟前 ⋅ 0

jsonrpc-4j代码解析

解析文件 AutoJsonRpcServiceImplExporter JsonServiceExporter AutoJsonRpcServiceImplExporter 路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter AutoJsonRpcServi......

郭恩洲_OSC博客 ⋅ 56分钟前 ⋅ 0

百度搜索

from selenium import webdriver import time brower=webdriver.Firefox() brower.get('http://www.baidu.com') input=brower.find_element_by_id('kw') input.send_keys('中南大学') time.s......

南桥北木 ⋅ 今天 ⋅ 0

tomcat 日志记录器

1、日志记录器是记录消息的组件 日志记录器需要与某个servlet 容器相关联 2、Logger 接口 共定义了5种日志级别:FATAL、ERROR、WARNING、INFORMATION、DEBUGGER setVerbosity 设置级别 setC...

职业搬砖20年 ⋅ 今天 ⋅ 0

Thrift RPC实战(三) Thrift序列化机制

1.Thrift基础架构 Thrift是一个客户端和服务端的架构体系,数据通过socket传输; 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports); 通过IDL脚本对传输数据的数据结构...

lemonLove ⋅ 今天 ⋅ 0

网站建设就要像2018世界杯的俄罗斯队大杀四方[图]

今天心情不错,因为昨天晚上观看了世界杯比赛,尤其是对俄罗斯队的大杀四方感到十分霸气侧漏啊,因此我联想到了自己的博客网站,我的博客是去年年底上线的,一直想建设一个关于读书和读后感作...

原创小博客 ⋅ 今天 ⋅ 0

linux 信号机制

signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协...

xxdd ⋅ 今天 ⋅ 0

my.cnf, my-small.cnf, my-medium.cnf, my-large.cnf

1. my-small.cnf # Example MySQL config file for small systems.## This is for a system with little memory (<= 64M) where MySQL is only used# from time to time and it's importa......

周云台 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部