在Java中,引用类型的变量非常类似于C/C++的指针。本文为新手进阶教程,为大家详细介绍引用的类型。

为了形象起见,也为了打字便利,本文后边的内容,都把“引证类型的变量”称为指针。所以,假设你原先有C/C++布景,今日讲的内容对你来说应该很好了解;不然的话,或许要多揣摩揣摩了。

◆创立Java进阶问题

假定咱们在函数中写了如下这个简略的句子:

StringBuffer str = new StringBuffer("Hello world"); 

别看这个句子简略,其实包括了如下三个过程:  

首要,new StringBuffer("Hello world")在堆里请求了一坨内存,把创立好的StringBuffer目标放进去。  

其次,StringBuffer str声明晰一个指针。这个指针自身是存储在栈上的(由于句子写在函数中),能够用来指向某个StringBuffer类型的目标。或许换一种说法,这个指针能够用来保存某个StringBuffer目标的地址。  

***,傍边这个等于号(赋值符号)把两者相关起来,也便是把刚请求的那一坨内存的地址保存成str的值。

Java新手进阶:细说引证类型  Java 进阶 引用 类型 第1张

◆引证目标之间的赋值、判持平

经过上述的图解,大伙儿应该了解指针变量和该指针变量指向的目标是一个什么关系了吧。  

仍是接着方才的比方,再来看赋值的问题。关于如下句子:  

StringBuffer str2 = str;

这个赋值句子是啥意思捏?实际上便是把str的地址仿制给str2,记住,是地址的仿制,StringBuffer目标自身并没有仿制。所以两个指针指向的是同一个东东。  

再搞一张示意图,如下(今日画这些图把我累坏了):

Java新手进阶:细说引证类型  Java 进阶 引用 类型 第2张

了解了赋值,判别持平的问题(便是==操作符)也就简略了。当咱们写如下句子“if(str2 == str)”时,仅仅判别两个指针的值(也便是目标的地址)是否持平,并不是判别被指向的目标是否内容相同。  

实际上两个指针的值相同,则肯定是指向同一个目标(所以目标内容必定相同)。可是两个内容相同的目标,它们的地址或许不一样(比方克隆出来的多个目标之间,地址就不同)。

◆final常量的问题

针对引证类型变量的final润饰符也是很多人搞混杂的当地。实际上final仅仅润饰指针的值(也便是限制指针保存的地址不能变)。至于该指针指向的目标,内容是否能变,那就管不着了。所以,关于如下句子:  

final StringBuffer strConst = new StringBuffer();

你能够修正它指向的目标的内容,比方:  

strConst.append(" ");

可是不能修正它的值,比方:  

strConst = null;

◆传参的问题

引证类型(在函数调用中)的传参问题,是一个适当扯的问题。有些书上说是传值,有些书上说是传引证。搞得Java程序员都快成神经分裂了。所以,咱们***来谈一下“引证类型参数传递”的问题。  

v仍是拿方才的比方,假定现在要把方才创立的那一坨字符串打印出来,咱们会运用如下句子:

System.out.println(str);这个句子又是什么意思捏?这时候就两说了。  

***种了解:能够以为传进函数的是str这个指针,指针说白了便是一个地址的值,说得再白一点,便是个整数。依照这种了解,便是传值的方法。也便是说,参数传递的是指针自身,所以是传值的。  

第二种了解:能够以为传进去的是StringBuffer目标,依照这种了解,便是传引证方法了。由于咱们确实是把目标的地址(也便是引证)给传了进去。  

费了这么多口水,其实不论是传引证仍是传值,都能够讲得通,要害取决于你是怎么看待参数所传递的东西。这就比如量子力学中“光的波粒二象性”,假设你以粒子的方法去丈量它,它看起来像粒子;假设你以动摇的方法去观测它,它看起来像动摇。假设你不太懂量子力学,前面这话当我没说 :-)

【修改引荐】

  1. 在 Java 类型中对称规划的重要性
  2. Java社区对甲骨文收买Sun一事的观点
  3. 甲骨文收买Sun意在Java 成为企业商场苹果
  4. IT职场训练 程序员Java面试中的32个圈套
  5. 4月17日外电头条:Java 7将向细颗粒并行化开展
转载请说明出处
知优网 » Java新手进阶:细说引证类型

发表评论

您需要后才能发表评论