yw2008 发表于 2023-10-3 19:56:55

Java为什么不让用指针?

Java为什么不让用指针?

jeanefu 发表于 2023-10-3 19:57:30

tl;dr 存在指针 ffi与native交互时常使用
如果单从表示一块内存区域首地址的角度来看实际上是存在的
https://b23.tv/9hFRkQl其中的
MemoryAddress即代表一个指针 对其可以取偏移量做各种操作
我猜测 不让你直接用裸指针原因
1,gc移动对象你的指针不一定准确
2,乱用指针会导致jvm崩溃
这些实际上只能够对应上指针实际上就是储存内存地址这个概念
对于指针的自增操作会前进对应步长这一部分 则是需要MemorySegement和layout共同完成,某种意义也可以复刻一下指针自增操作
当我们不考虑指针越界等内存无效的场景时,在c中经常存在的指针强转或者直接给一个值作为指针值的操作 在新的ffi中也是允许的
说回堆内的情况 jvm允许你解一个指针找到对应的jvm对象 允许你修改其指向,但是通过类型系统限制了指针类型的自由转换,以及完全关闭了用户侧指针的算术操作,尽可能因用户操作失误导致的内存无效情况
即java/jvm提供了一套可能比较别扭的堆外指针体系和一套受限的堆内指针体系

最后骂一句 新的ffi没给栈上分配的api 就导致我要跟二重指针交互 需要在堆上开一个空间放指针的值 也不知道jit能不能有优化掉这个case
反正没人看 贴个情绪的图

http://picx.zhimg.com/v2-d098ceda82380ec5a35dae063946fc95_r.jpg?source=1940ef5c

defiler 发表于 2023-10-3 19:57:50

让用让用。Java里除了那几个极少的原生类型,其它的都是指针啊。
Java是让你用指针的,甚至必须用指针。它不让你把对象创建在栈上,必须用new,也就是必须用指针。
因为必须用指针,“->”的写法就太罗嗦了,用“.”替代就行了。
还有它不让你在这个指针上加加减减地移来移去,还告诉你说它帮你释放指针所以不用你自己delete了。
还有就是,Java一般把这种智能指针叫“引用”。

mjfh 发表于 2023-10-3 19:58:33

有没有可能,Java 里到处都是指针?[狗头]
当初从C++刚来Java的时候,特别不爽是,明明声明了一个变量,还得要 New 一下,这在 C++ 中, New 不是只有指针才会有的行为吗?所以想深一层, Java 里“处处是对象”,只不过是“处处是对象的指针”[狗头]

qq911 发表于 2023-10-3 19:58:52

绝大多数答案是错的,Java 有直接操纵内存的指针,只是很少人知道。

licemiao 发表于 2023-10-3 19:59:18

Java其实是有指针的,但是不给你用,因为安全,怕你搞出事情来
页: [1]
查看完整版本: Java为什么不让用指针?