易截截图软件、单文件、免安装、纯绿色、仅160KB

C++和Java中类引用的区别


 在C++和Java中都存在类引用,C++中是要明确指出的,显性的;而Java中是隐形的。
  在C++中,"T &b=a;" 说明b是a的引用,两者是同名,指的同一个东西。而非指针的类声明,就同时创建了一个类,如"T a;"实际上a已经实例化了。而声明类引用时不需要创建新对象,而是直接指向原来的对象。
  类引用在函数的形参和返回值中起到很大的作用。默认的类参数,是通过复制函数(重载=运算符),复制入参一个新对象给函数体。函数中如果修改形参,不会对入参有影响。如果返回值也是类,那么也会通过复制函数,构造一个新对象返回给调用者。
  如果形参采用类引用,那么函数将直接引用原有的入参,此时修改形参就会修改真实的入参。返回值是类引用时,将不再使用复制函数,而是直接将对象返回给调用者。如果返回的对象是局部变量,那么采用引用返回就会出错。
  在Java中,类实例声明和构造是分开。"T a;"是声明,而"a=new T();"才是构造。引用声明和C++相同。但是Java的机制与C++不同,Java中的引用也叫句柄,或者说句柄才是其真实名称。类声明的都是一个句柄,调用构造函数才会使得句柄指向类实例。因此Java中没有类似于C++中的复制函数,因为Java的复制都是直接复制句柄内容。例如"T b=a;"只不过是将a的句柄复制(赋值)给了b,从而b也指向a指向的类实例。可以看出Java与C++在此处的不同,Java依然只有一个实例,而C++则存在了两个实例。
  所以在函数中,Java的形参都是入参的句柄复制,并且是浅复制(只复制该句柄,而不复制句柄指向的下一层句柄)。因此在函数中,直接修改形参是不能改变入参的。但是如果修改形参指向的对象的下一层句柄则会修改入参。因此在Java中不存在像C/C++中一样的Swap函数。函数的返回值,也是句柄复制。如果在函数中构造一个局部变量类实例,那么是可以返回到外部的,当然那个局部变量的句柄是不存在了。
  Java中要复制对象,需要重载clone函数,并且要分清是浅复制还是深复制(完全构造一个新对象,两者的内部数据和实例不存在重叠)。
 


相关文档:

JAVA Object[]数组转化问题

最近遇到了一个问题,就是在用到List.toArray 方法时,返回Object[]数组,直接把它强转成其他类型的会报错:
   code:  ArrayList list=getList();
             String[] s=(String[])list.toArray();
   except ......

JAVA面试题及答案(基础题122道)

JAVA相关基础知识
1、面向对象的特征有哪些方面 
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层 ......

★★★★★这几天的java学习

      这几天的学习 让我感到发懵,老师讲的很多,自己就根本无法去思考,只能一个劲的往里听,自己代码也不怎么会,老师讲过的能有个印象, 不过今天还好,讲到了Java基础加强,稍微感觉好点,并不是很难理解了,今天就开始今天课程的复习了,要想进步,只有自己艰苦努力啦!
    确 ......

Java中集合


Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container
classes),又称群集类(collection classes)。集合在java中非常重要,在讨论之前,先来看几个面试中的经典问题。 
1 Collection 和
Collections的区别。 
2 List, Set, Map是否继承自Collection接口。  ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号