Java没有指针,那它是怎么干C语言里指针干的活的?

一句话简单回答就是:Java虽然有指针,但到处都是指针的影子!只是Java通过JVM把它隐藏了起来,不让你用C/C++那种显式的方式操作它。我们把这个东西称之为"引用"。


一、C/CPP指针与Java引用的对比:

C/CPP的指针被JVM包装成了更加安全的Java引用

特性 C++ 指针 Java 引用
语法​ MyClass *obj = new MyClass(); MyClass obj = new MyClass();
本质​ 存储另一个变量的内存地址 本质上也是存储对象的内存地址​
操作​ 可以进行算术运算(++, --)、任意转换 不能进行算术运算,类型安全
目标​ 可以指向任何内存地址(包括无效的) 只能指向有效的对象或null

所以说,并不是Java里没有指针,而是强大的JVM帮我们把指针操作更包装成一个更安全、不需要担心回收的引用。


二、Java执行MyClass obj = new MyClass()到底发生了什么

1、声明引用变量MyClass obj时,JVM在当前方法的栈帧(Stack中)中分配一个引用变量的空间给obj;

2、创建实例化对象new MyClass()时,JVM在堆区(Heap)分配足够的内存来存储MyClass对象的所有数据

3、建立指向关系=,将堆中对象的内存地址赋值给栈中的引用变量obj,使得引用指向实例化对象。

补充JVM架构图:

三、JVM还包装了哪些机制

  1. 垃圾回收机制

    java 复制代码
    MyClass obj = new MyClass(); // 手动分配
    // ... 使用对象
    obj = null; // 无需手动释放!垃圾回收器会自动回收内存
  • Java有一个后台的垃圾回收器GC,它会自动监控哪些对象不再被任何引用指向。
  • 当对象变得"不可达"时,GC会在某个时间点自动释放它们占用的内存。
  • 优势:避免了可怕的内存泄漏和悬空指针问题。
  • 代价:程序员无法控制内存释放的精确时机,可能有性能开销。

2. 完全禁止指针算术和直接内存操作

C/C++可以通过操作指针进一步操作内存,这是它强大但也危险的地方。但是考虑到Java是站在C/CPP之上的语言,它完全摈弃了指针算术和直接内存操作,

通过禁止这些操作,Java保证了:

  • 内存安全:程序不会意外覆盖随机内存,导致崩溃。
  • 类型安全:避免了因类型转换错误导致的数据损坏。
  • 可移植性:Java程序不依赖特定硬件的内存布局。

四、CPP与Java在函数参数传递的区别(引用传递)

CPP可以在方法的参数列表上指定到底是传参数的数值还是引用,但对于Java来说: Java里对于方法传入的是对象就是对象引用的副本,如果是基本类型就是值的副本,不会影响本身。

温馨提示:1、String虽然是数组,但是由于String的final属性,传入方法后,还是不能对其本身进行修改(若需要修改可以使用StringBuilder对象);2、数组也是对象哦(这个确实是基本常识,但是我刚学Java时老是觉得int \[\] arr是基本数据类型hhh,所以在这儿提醒下刚学Java的小白)。

相关推荐
古法老登瞎折腾8 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
智能运维指南9 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks10 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵10 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设10 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都10 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵10 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
白山编程大哥10 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Linux运维技术栈11 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
On The Road :11 小时前
Java 多线程详解:从入门到线程安全
java·python·安全