Hi,你好。 下面我们一起来学习没有指针的java语言。java语言里面呢,不谈指针。 但是我们知道在计算机里面呢,没有指针呢可以说是寸步难行。那java语言它是怎么处- 理的呢? 实际上java里面用引用这个概念来代替了指针,引用,它的实质就是指针。 我们知道呢,一个引用,比如说person P等于new person, 它实际上就是P这个引用呢,它就指向了 这个对象实体,所以它本质就是指针。但这个指针呢, 它是安全的,受控制的,也就是说我们这个指针不能乱指, 它一定要指向相应的,正确的那个对象实体。 所以呢,这里面,比如说这个安全性包括了 也就是它会检查这个指针是不是空的,是不是,是不是null, 然后呢,在这里面呢也没有指针运算,因为指针运算呢它很容易 就把一个指针呢再加一点就指向别的地方了,很容易造成内存的 那个错误访问,也不能访问没有引用到的内存。 那所谓它才使得那个自动的垃圾回收呢成为可能, 因为我们所有的这种引用呢 都是系统受控制的,都是能够管理的,所以 知道它这个,那个内存实体它是不是有用。 那么我们这里呢,通过几个知识点来看一下C语言这种 指针呢在java里面它怎么体现的。一个最典型的呢C语言里面是传地址, 传地址,用传地址来表示指针,那我们这里呢,java里面 是怎么做的呢?它是用对象。我们知道对象它本身就引用型, 那引用型呢本身就相当于指针,比如说我们查一个引用,那这个引用呢, 就能把这个引用的对象的属性啊,方法调用这个属性去修改, 然后也可以调用对象的方法,所以在一定意义上,它就是能够 访问到所,它所指向的对象的属性,就是引用类型就代替了这个 我们说以前的那个指针。当然,因为我们知道java里面还有一种类型是基本类型, primitive ,这个基本类型呢它就没有对应的这个 比如说我们在C语言里面可以交换两个整数,可以那样写, swap,然后intx或y, 然后呢我们可以呢,x,y交换,那这里呢,如果我们把这 改成一个指针,那我们就可以呢对这两个变量进行交换, 如果不用指针,你看我们这种方式呢不用指针,那我们就达不到 这个a,b变量交换的目的,所以java里面它没有 这个办法,所以这是没办法的办法,因为没办法,因为它是基本类型,它就做不到 这个,注意这点事情。但是呢可以有一些变通的办法,比如说我们构造一个 实体,构造一个class,这个class呢有x,y两个分量,那这样的话我们传一个引- 用过去, 然后呢,再把这个引用传出来,我们就能得到这两个属性。当然呢,也就是说 这种情况还是比较少的,因为我们大部分呢都能实现。 第二个呢就是我们有指针运算,C语言里面有指针运算,那指针 运算呢,在java里面呢是不允许的,但是呢我们有一些变通的办法,比如说 *(p+5)就可以用数组呢第5个元素,所以 它有一种类似的这个变通的办法,所以指针运算呢,在这里就用数组的方式 来体现的。另外一个呢,就我们含有函数指针也是相当典型的, 那函数指针呢在java里面呢,它实际上是用接口或Lambda表达式来表示的, 因为我们知道接口它本质上是什么呢?本质上就是 一个约定,那这里这函数指针它就是一个安全的约定,它要 这个函数它叫什么名字?然后带什么参数? 所以呢,它本质上呢就是对那个函数指针的一个约定。我们前面讲的Lambda表达式呢 是自动接口的更简洁写法,这个更简洁写法更能体现这个函数指针 的概念,比如说我们求积分,那你就带一个Lambda表达式,实际上是一个函数指针,一- 个函数。 类似地,其他都是这样,包括事件处理里面都是这样的。我们还有呢,比如说 最典型的一个应用呢在C语言里面,比如说我们用链接来表示的 链表,linked list链表,或者呢我们表示树状结构, tree,树状,那这些呢,我们都需要指向结点的一个指针。 那在这里面呢,我们实际上是用对象的引用就可以了。比如说一个 结点,一个链表,我们要做一个链表,那结点呢包括数据, 然后呢还包括next,就是下一个结点,注意,这里 这个next呢它并不是这个结点的对象实体的复制, 它只是个引用,所以它本质上呢这个Node next呢它就是一个 相当于一个指针。所以,这个也就是说 我们以前指针在这里实际上是很自然地,它就是个结点的引用。 有一个例子呢,就是list.java是我们用这种 自己来写一个链表实现linked list,这个代码呢,你可以 课后去看一下,我这里就不演示了。另外呢,我们在java语言里面呢, 有一种方式呢可以调用别的语言,特别是C语言的一个,一些方法函数,那这里呢这个技术 呢叫JNI,也就是Java Native Interface, 叫JNI。它实际上呢就是java的代码呢可以调用其他语言的代码, 包括我们要用中间一个机制,就是能够 访问到C语言里面的,包括头文件等等,然后 能调用它的一些指令。那但这个呢,就跟操作系统有关了, 所以我们看到呢,java里面,它在更底层的一些东西它最终 是要调用操作系统的那些函数,那么它是用什么方式呢? 就叫JNI,这里呢我们就不详细讲它了。