基于指针pointers和引用references的区别分析_java

指针用“*”和“->”操作符,引用用"."操作符,当然这是表面的区别。

    1、引用必须代表一个对象,没有所谓的空引用。指针可以为NULL。即引用必须有初值,指针不然。所以在使用pointers之前,必须测试它是否为null。references不需要测试。

    2、pointers可以被重新赋值,指向另一个对象,reference总是指向(代表)它最初获得的那个对象:

复制代码 代码如下:

string s1("Nancy");
string s2("Clancy");

string &rs = s1;      //rs指向s1.
string *ps = &s1;  //ps指向s1.
rs = s2;                 //rs仍然代表s1,
                             //但是s1的值变成了“Clancy”

ps = &s2;             //ps现在指向s1,
                            //s1没有变化

    3、还有一些情况需要使用references。例如实现某些操作符的时候。最常见的例子是operator[]。这个操作符很特别的必须返回某种“能够被当做assignment赋值对象”的东西。

    4、结论:当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是你实现一个操作符而其语法需求无法由pointers达成,你应该选择references。任何其他时候,请采用pointers。

时间: 2024-09-19 18:46:59

基于指针pointers和引用references的区别分析_java的相关文章

基于Java多线程notify与notifyall的区别分析_java

当一个线程进入wait之后,就必须等其他线程notify/notifyall,使用notifyall,可以唤醒所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一个.注意,任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized 中的代码,notifyall只是让处于wait的线程重新拥有锁的争夺权,但是只会有一个获得锁并执行. 那么notify和notifyall在效果上又什么实质区别呢?主要的效果区别是notify用得不好容易导致死锁,

java中的值传递和引用传递的区别分析_java

传值---传递基本数据类型参数 复制代码 代码如下: public    class           PassValue{    static void exchange(int a, int b){//静态方法,交换a,b的值        int temp;        temp = a;        a = b;        b = temp;    }    public static void main(String[] args){       int i = 10;   

java中ArrayList 、LinkList的区别分析_java

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问get和set,ArrayList优于LinkedList,因为ArrayList可以随机定位,而LinkedList要移动指针一步一步的移动到节点处.(参考数组与链表来思考)     3.对于新增和删除操作add和remove,LinedList比较占优势,只需要对指针进行修改即可,而ArrayList要移动数据来填补被删除的对象的空间. ArrayList和LinkedL

Java之String、StringBuffer、StringBuilder的区别分析_java

相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE 5.0 里面带来的一个新的字符操作的类-- StringBuilder .那么这个 StringBuilder 和 StringBuffer 以及我们最早遇见的 String 类有那些区别呢?在不同的场合下我们应该用哪个呢?我讲讲自己对这几个类的一点看法,也希望大家提出意见,每个人都有错的地方,在

struts2过滤器和拦截器的区别分析_java

本文分析了struts2过滤器和拦截器的区别.分享给大家供大家参考,具体如下: 一.本质区别: 1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调. 2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器. 3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用. 4. 拦截器可以访问action上下文.值栈里的对象,而过滤器不能访问. 5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 二.使用区别:

java中成员变量与局部变量区别分析_java

本文实例分析了java中成员变量与局部变量区别.分享给大家供大家参考.具体分析如下: 成员变量:在这个类里定义的私有变量,属于这个类. 创建以及使用成员变量 复制代码 代码如下: public class Person {     String name;     String Sex;     int age;     double Height;         public static void main(String arges[])     {         Person p=ne

Java方法的覆盖与隐藏的区别分析_java

关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行期的多态,当一个父类引用指向子类对象的时候,请看下面我编写的一段代码: 复制代码 代码如下: public class RunTime {     public static void main(String[] args) {        Animal a = new Cat();        System.out.println(a.A);        Syst

Java中Runnable和Thread的区别分析_Java编程

Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子: 复制代码 代码如下: package org.thread.demo; class MyThread extends Thread{ private String name; public MyThread(String name) { super(); this.name = name; } publ

java中重载、覆盖和隐藏三者的区别分析_java

重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的