Java是否有指针?针对两种矛盾说法的技术疑问求解
Java 是否存在指针?
两种说法的立足点不同,本质上都没有错:
- 从底层实现和概念本质来看,Java存在指针
Java中的所有引用类型变量,本质上就是JVM封装后的指针。比如你写Object obj = new Object();时,栈上存储的obj变量本身保存的就是堆内存中实际Object实例的起始地址,这个地址指向的逻辑和C/C++的指针完全一致。把obj赋值给其他变量、作为参数传递给方法时,传递的也是这个地址的值,修改引用指向的对象属性时,所有持有该引用的变量都能感知到变化,这也是指针的典型特性。 - 从开发者可直接操作的语法层面来看,Java没有暴露原生指针
和C/C++不同,Java没有提供任何语法允许你直接获取指针的数值、对指针做加减偏移等运算,也不允许指针指向任意内存地址,更不需要开发者手动释放指针指向的内存空间。Java语法中没有*解引用、&取地址这类操作符,也不存在int*这类原生指针的声明方式,所有的内存管理、指针越界检查都由JVM自动处理,普通开发者完全感知不到指针的存在,也不需要直接和指针打交道。
简单来说,Java把指针做了一层安全封装藏在了底层,只给开发者提供了更安全的引用操作,所以才会出现两种完全相反的说法。
内容的提问来源于stack exchange,提问作者Sky Herobrine
相关产品推荐
相关产品推荐

