C++中的指针,引用和Java中的对象引用
一、C++中指针和引用的区别
- 相同点:在c++中,指针和引用都可以让人间接地操作一个对象。
- 不同点:
1、两者在定义上不同:指针是存放对象的地址的一块内存,而引用是对象的别名。
2、看看以下的几行代码:
int a,b,*p,&r=a;//正确
r=3;//正确:等价于a=3
int &rr;//出错:引用必须初始化
p=&a;//正确:p中存储a的地址,即p指向a
*p=4;//正确:p中存的是a的地址,对a所对应的存储空间存入值4
p=&b//正确:p可以多次赋值,p存储b的地址
从以上代码我们可以看出第二个不同点:指针可以为空指针,但是引用在声明阶段就必须要初始化。
3、另外的,由于指针是用于存放对象地址的内存,所以可以改变其值以改变其指向的内容;而引用在定义初期就绑定了对象,不能修改自己指向的对象,所谓从一而终。
严格意义上讲,以上就是两者的全部区别了,接下来再说说,两者的应用场景和优缺点:
1、指针的优点在于其更加灵活,你完全可以随时随地的操作指针的值,但是,放纵的同时也会带来隐患,空指针,野指针的问题,如果程序员没有加以控制,则会带来灾难。
2、引用则很好的避开了指针的缺点:声明时初始化,意味着程序员可以无需对引用进行空指向判断。同时,无法对其绑定的对象进行更改,像极了一个指针常量的实现(const),安全可靠。
二、Java中的对象引用
再说回Java,Java中也有引用的概念,也有对象的概念,但是都区别于c++。
对象:c++中的对象,是一个内存地址和其存储的数据,可以是int、double and so on;Java中有基础数据类型的概念,它的的对象,更加严格,是一个类的实例化,同时Java中所有的类都默认继承了Object类,拥有着Object类的所有特性。
引用:首先得说明,Java中的引用和C++中的引用完全不是一个东西,Java引用其实更像是指针,因为Java引用本身也占有内存,也指向着一块内存。
进一步说明C++指针和Java对象引用:
1、Java对象引用可以为空(如:Person person;);
2、Java对象引用可以更改其指向的值:
Person p1 = new Person();
Person p2 = new Person();
p1 = p2;
从上面看来,Java引用是不是像极了指针,然而,凡事都有一个但是:
总体来说,Java引用功能上还是相对受限的。如,Java对象引用并不像指针那么奔放,不能被直接操作,指针p++,p--,这样的操作在Java中是不可能见到的,同样Java也不能获取引用指向的地址。似乎很让人失望,Java中怎么又没有了指针?
好吧,如果真的要明说,Java中确实没有指针,或者说,Java中有一个功能受限的指针(阉割版的指针),对C++痴迷的同学或许会对此举很不屑,但是还是那句话,约束换来的是安全,Java中弱化了甚至取消了指针的概念,为的就是更加有力且简洁的面向对象。
毫无疑问,Java引用是一个很伟大的抽象,弱化指针,取消了指针的运算,语法上全力隐藏指针,为的就是让我们仿佛在和真的对象打交道一般。但这样很容易让人混淆概念,忽略底层实现,初学者必须要谨记,对象引用,不等于对象!!!