在java中,object就是一个指针,它指向了一片内存地址,里面存储了object中的变量。

所以我们也可以使用这一技巧来处理指针。

下举一c中的指针例子,我们接下来把它改写成java, 首先是c版本

1 void main() {
2int*x;// 建立指针x,y
3int*y;// (但是还没有指向任何目的地)
4
5x = malloc(sizeof(int));// 分配一块可以存储int的内存区域
6// 让x存储这块内存的地址
7
8*x = 42;// 将42存储到这个目的地
9
10*y = 13;// 错误,y没有指向任何区域,所以这里会报错
11
12y = x;// 让y指向x所指向的目的地
13
14*y = 13;// 将13存储到y所指向的目的地,其实和x所指向的目的地是一个地方
15 }
16

java版本

1 class intobj {
2public int value;
3 }
4
5 public class binky() {
6public static void main(string[] args) {
7intobjx;//建立指针x,y
8intobjy;// (都还没有指向任何目的地)
9
10x = new intobj();// 分配一块内存区域
11// 让x指向这块内存区域,就是x存储这块内存的地址
12
13x.value = 42;// 将42存储进内存区域
14
15y.value = 13;//错误,y没有指向任何内存区域,用java的话说就是没有初始化
16
17y = x;// 让y指向x所指向的内存区域,那么即使y不初始化,也可以开始使用
18
19y.value = 13;// 将13存储到y所指向的内存区域,就是x所指向的内存区域
20}
21 }
22

这样一来,java里面也就实现了c的指针操作。从这个例子我们可以看出,java的类、实例其实就是指针,

下面的例子更清楚的表达了这一点。

再看一个例子,就是一个linklist的例子,它的结构如图

java指针传递 java如何实现指针_class

还是先看c代码,再看java代码,我折叠了一下,免得太长碍眼。

java指针传递 java如何实现指针_class_02

java指针传递 java如何实现指针_struct_03

c linklist code

1 struct node {
2int value;
3struct node* next;
4 };
5
6
7 {
8// 建立指针
9struct node* x;
10struct node* y;
11struct node* z;
12
13// 分配内存
14x = malloc(sizeof(node));
15y = malloc(sizeof(node));
16z = malloc(sizeof(node));
17
18// 赋值
19x->value = 1;
20y->value = 2;
21z->value = 3;
22
23// 给指针变量赋值,值当然也是指针类型
24x->next = y;
25y->next = z;
26z->next = x;
27 }
28

java指针传递 java如何实现指针_class_02

java指针传递 java如何实现指针_struct_03

java linklist code

1 class node {
2public int value;
3public node next;
4 };
5
6 {
7// 建立指针,就是实例化类
8node x;
9node y;
10node z;
11
12// 初始化,也就是让指针指向某个内存区域
13x = new node();
14y = new node();
15z = new node();
16
17// 给其中的变量值赋值
18x.value = 1;
19y.value = 2;
20z.value = 3;
21
22// 给其中的指针值赋值,赋的值当然也是指针类型
23x.next = y;
24y.next = z;
25z.next = x;
26 }
27

我们可以看到在java linklist的最后部分x.next=y;由于next是一个指针类型,那么给它赋的值必然也是指针类型,

那么y必然也是指针类型,又因为y为node class的一个instance,所以可见所有的instance的名字其实就是一个指针

所以这里才这样来实现linklist,以前我对于java的linklist一直觉得很神奇,怎么能够在自己的作用域中间还包含了自己的类,学习了指针的概念以后就明白了,其实instance自己就是一个指针,不过是在instance里面包含另外一个指针而已。