昨天我参加了一家知名欧洲公司的首席技术官的谈话,直到最近他才知道java有指针。在面对他时,他说他绝对肯定在java中存在指针/不安全的代码。
答案 0 :(得分:20)
有一个名为sun.misc.Unsafe
的课程,这是真的。但它没有在Java代码中使用指针(因为Java没有指针,虽然我同意java引用在概念上类似),但大多数是使用本机代码实现的。
正如我在评论中提到的,这不是公共API的一部分,不应被客户端代码使用。但是,当您查看the java.util.concurrent.atomic
package中Atomic*
类的来源时,您可以看到它正在工作。
答案 1 :(得分:15)
答案 2 :(得分:10)
Java有指针。
Java是否有指针的混淆与Java是通过引用调用还是按值调用的讨论密切相关。
不知情的人认为Java没有指针,并且因为一个方法可以将一个传入的对象改变为可以改变的效果传递给调用者,他们认为必须通过引用调用它。
但这不正确。
在Java 指针中传递的值是。 Java中的对象没有其他类型的变量而不是指针变量,并且没有引用调用。
“不安全”的故事是另一回事。这通常不同于Java是否有指针的问题。 Java的指针是安全的;它们指向对象并使用正常的语言结构,它们不能被操纵以指向任意的内存位置。
然而,有JNI,但是本机代码可能不安全,而不是Java代码。
还有Real-time Java(jsr-1),您绝对可以访问系统中的特定内存位置。然而,这是一个非常特殊且相当罕见的Java版本,主要用于嵌入式目的。如果这意味着我想它会被明确提及。
答案 3 :(得分:8)
Java没有指针,只有对象的引用。引用类似于指针,因为它指向一个变量,一个对象,但是您无法查看或编辑此引用的地址内存,您可以在C中执行此操作。
另一件事。在C中,您可以使用引用/解除引用操作来管理指针,将*指针的名称放在第一位。在Java中,此操作(引用/解除引用)完全不存在,因为它是完全自动的,对用户隐藏。
答案 4 :(得分:3)
指针是指向引用的概念。在C和C ++中,您可以显式访问指针,但在java中,我们使用引用指向对象。例如,如果您将一个实例传递给一个方法,它的引用传递我们知道,但最终传递指针。当您在方法中更改实例的状态时,它会反映在完成方法调用后使用该实例的时间。
我们在java中使用引用,它是关于JVM的指针。
当我们使用new运算符时,它在堆中创建实例并将地址返回给它指向的引用。
我相信这会回答你的问题,如果你不能评论我的答案。
答案 5 :(得分:1)
您可以使用Java(JNI)调用本机函数,因此从这个意义上说,您可以使用指针。但除此之外 - 不,Java中没有指针。
答案 6 :(得分:1)
他可能会对按值调用和按引用调用轻微混淆。如果他来自C,他可能会认为引用调用等于指针。只是一个猜测。