[6/8] java中的指针学习心得
在java中,object就是一个指针,它指向了一片内存地址,里面存储了object中的变量。
所以我们也可以使用这一技巧来处理指针。
下举一C中的指针例子,我们接下来把它改写成java, 首先是c版本
1 void main() {
2 int* x; // 建立指针x,y
3 int* y; // (但是还没有指向任何目的地)
4
5 x = malloc(sizeof(int)); // 分配一块可以存储int的内存区域
6 // 让x存储这块内存的地址
7
8 *x = 42; // 将42存储到这个目的地
9
10 *y = 13; // 错误,y没有指向任何区域,所以这里会报错
11
12 y = x; // 让y指向x所指向的目的地
13
14 *y = 13; // 将13存储到y所指向的目的地,其实和x所指向的目的地是一个地方
15 }
16
2 int* x; // 建立指针x,y
3 int* y; // (但是还没有指向任何目的地)
4
5 x = malloc(sizeof(int)); // 分配一块可以存储int的内存区域
6 // 让x存储这块内存的地址
7
8 *x = 42; // 将42存储到这个目的地
9
10 *y = 13; // 错误,y没有指向任何区域,所以这里会报错
11
12 y = x; // 让y指向x所指向的目的地
13
14 *y = 13; // 将13存储到y所指向的目的地,其实和x所指向的目的地是一个地方
15 }
16
java版本
1 class IntObj {
2 public int value;
3 }
4
5 public class Binky() {
6 public static void main(String[] args) {
7 IntObj x; //建立指针x,y
8 IntObj y; // (都还没有指向任何目的地)
9
10 x = new IntObj(); // 分配一块内存区域
11 // 让x指向这块内存区域,就是x存储这块内存的地址
12
13 x.value = 42; // 将42存储进内存区域
14
15 y.value = 13; //错误,y没有指向任何内存区域,用java的话说就是没有初始化
16
17 y = x; // 让y指向x所指向的内存区域,那么即使y不初始化,也可以开始使用
18
19 y.value = 13; // 将13存储到y所指向的内存区域,就是x所指向的内存区域
20 }
21 }
22
2 public int value;
3 }
4
5 public class Binky() {
6 public static void main(String[] args) {
7 IntObj x; //建立指针x,y
8 IntObj y; // (都还没有指向任何目的地)
9
10 x = new IntObj(); // 分配一块内存区域
11 // 让x指向这块内存区域,就是x存储这块内存的地址
12
13 x.value = 42; // 将42存储进内存区域
14
15 y.value = 13; //错误,y没有指向任何内存区域,用java的话说就是没有初始化
16
17 y = x; // 让y指向x所指向的内存区域,那么即使y不初始化,也可以开始使用
18
19 y.value = 13; // 将13存储到y所指向的内存区域,就是x所指向的内存区域
20 }
21 }
22
这样一来,java里面也就实现了c的指针操作。从这个例子我们可以看出,java的类、实例其实就是指针,
下面的例子更清楚的表达了这一点。
再看一个例子,就是一个linklist的例子,它的结构如图

还是先看C代码,再看Java代码,我折叠了一下,免得太长碍眼。
我们可以看到在java linklist的最后部分x.next=y;由于next是一个指针类型,那么给它赋的值必然也是指针类型,
那么y必然也是指针类型,又因为y为node class的一个instance,所以可见所有的instance的名字其实就是一个指针
所以这里才这样来实现linklist,以前我对于java的linklist一直觉得很神奇,怎么能够在自己的作用域中间还包含了自己的类,学习了指针的概念以后就明白了,其实instance自己就是一个指针,不过是在instance里面包含另外一个指针而已。

浙公网安备 33010602011771号