[6/2a1a] 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里面包含另外一个指针而已。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】