JAVA中的"指针"——引用变量

指针是一种在众多编程语言中非常常见的概念,它的使用非常广泛。实际上,Java为了避免使用上的繁琐,其设计者用引用变量的概念代替了指针,但是实际使用上,两者比较类似,所以本文依旧以指针为题来讲述此类概念。下面我们就来介绍一下指针的概念。

在介绍指针之前,我们首先要弄清楚Java中的两大重要储存空间——堆和栈。为了使用上的方便,堆(Heap)和栈(Stack)分别用来储存不同的东西。下表对比了两者的特点:

储存区域 储存内容 优点 缺点 回收
基本类型的变量和对象的引用变量 存取速度比堆要快,仅次于寄存器,栈数据可以共享 存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量 当超过变量的作用域后,Java会自动释放掉该变量,内存空间可以立即被另作他用
由new等指令创建的对象和数组 可以动态地分配内存大小,生存期也不必事先告诉编译器 由于要在运行时动态分配内存,存取速度较慢 由Java虚拟机的自动垃圾回收器来回收不再使用的数据

为了更加形象的解释这些概念,我们不妨看一看下面的例子:

A a = new A();

上述代码是在Java编程中时常会会出现的,我们来好好的分析一下,这样简单的一行代码究竟是做了什么。实际上,这小小的一行代码是做了三件事情,这行代码的前半部分申明了引用变量a为A类型,并将其储存到栈(Stack)当中并分配了一个储存地址给它, 其代码为:

A a;

接着,这行代码创建了一个新的类型为A的对象,这个过程用关键字new来实现,创建的新对象被储存在堆Heap里,并被分配了一个储存地址,其代码为:

new A();

最后,这行代码中的等号”=“将储存在堆里的引用变量a指向了栈里新创建的对象A(),这个指的过程用储存地址来实现,也就是说,等号将两个储存地址配对并连接了起来。

Note: 值得注意的是,在Java中,使用引用变量时,等号”=“并不是给等号左边的变量赋上右边的新值的意思,而是将等号左边的变量指向右边的对象的地址的意思。当人们将一个引用变量先等于对象a,再等于另一个对象b时,并不是将储存在堆(Heap)中的a对象的值改变成了b,而是将引用变量指向对象a的指针断开,接着将指针指向了对象b。下面我们用一个例子来解释这个过程:

在一个足球队中,有很多球员,而只有一个队长。有的时候,我们想要更换队长,这个例子用来实现这个过程。我们首先创建两个球员——洛里和凯恩(对象包括球员的姓,名和踢球的位置):

Player llorris = new Player("Llprris", "Hugo", "Goalkeeper");
Player kane = new Player("Kane", "Harry", "Center Forward");

其实这两行代码实现了如下图的情况:

图片名称

也就是在栈(Stack)中首先申明了引用变量llorris和kane,接着在堆(Heap)中创建了两个Player对象,最后将左边的引用变量指向右边对应的对象。

这时候,我们首先将队长设置为洛里,代码为:

Player captain = llorris;

通过这行代码,我们首先申明了引用变量captain,并将其指向变量llorris指向的对象。其情况如下图所示:

图片名称

接着,我们将队长更改为kane,代码为:

captain = kane;

这时候,captain指向llorris所指向的对象的指针被删除,而一个新的从captain指向kane所指向的对象的指针被创建,其情况如下图所示:

图片名称

堆(Heap)中llorris所指向的对象的值并没有发生改变,只是引用变量captain所指向的对象发生了变化。

如果我们改变引用变量kane所指的对象的值,那么由于引用变量captain所指的对象和kane相同,那么captain所指对象的值也就改变了。比如我们将kane的位置改为Center Back,代码为:

kane.position = "Center Back";

那么,就发生了如下图的变化:

图片名称

所以captain.position的值也会从”Center Forward”变为”Center Back”。

Note:

  1. 当堆(Heap)中的对象没有被栈(Stack)中的引用变量所指时,java虚拟机(JVM)会在之后自动识别到他们,并将它们扔进回收站,从而不再继续占用储存空间。
  2. 当我们将引用变量指向”null”后,这个引用变量原本指向的指针会被断开,且不再指向任何对象,但是JVM不会自动删除它们。

总结

引用变量是Java中非常重要的一个基本概念,在理解上很容易由于”=“的使用和基本变量时不同造成混淆。引用变量如果C语言中的指针,其被储存在栈(Stack)中,可以用”=“将其指向堆”Heap”中的对象。当引用变量再次指向一个新的对象时,原本的指针断开,指向新的对象。当引用变量设置为等于”null”后,它不再指向任何对象。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容