C++ 视角下的 Java 对象和指针

标签 java c++

<分区>

我最近读了这篇文章:Is Java "pass-by-reference" or "pass-by-value"?

第一个答案过于简洁和具体,无法让我有明确的理解,其他人都写了 15 页的文章来解释什么应该是一个简单的主题。以下规则是否正确(如果为真,则非常简单):

1.) 与非基元类型关联的命名事物(Java 中的“对象引用”)在 C++ 中是指针。

2.)。在 Java 指针上使用 -> 与在 C++ 指针上使用相同。

3.) 在 Java 指针上使用 = 与在 C++ 指针上使用 = 相同。

4.) 所有函数都按值传递(因此按值传递 Java 指针)。

(这忽略了内存管理差异,例如 = 在 Java 指针上很好,而 = 在 C++ 指针上意味着您可能需要担心内存管理)

这个难题中最令人困惑的是,我所见过的没有人用清晰的英语表达了这套规则/对 Java 正在做什么的理解(而是选择了 15 页和图表)。第二个最令人困惑的元素是 Java 以不同于 C++ 的方式使用“引用”一词。如果您想将 Java 在 C++ 方面所做的事情进行类比,指针和我创建的规则是消化 Java 行为的最简单术语。

最佳答案

第 1 点是正确的。

Object o = new Object();

变量 o 存储指向对象在内存中的位置的指针。

第 2 点也是正确的。

Object o = new Object();

o.hashCode();

这是在调用存储在o中的对象的hashCode方法。

第3点,再次纠正。

Dog d = new Dog();

Dog d2 = new Dog();

System.out.println(d == d2);//This will print false

d2 = d;

System.out.println(d == d2);//This will print true

在第一个输出中,d 不等于 d2,因为指向对象的指针不同。在第二个输出中,d 确实等于 d2,因为它们都指向相同的位置。

第 4 点在技术上是正确的。

基元按值传递。 A 将对象传递给函数时,它传递的是指向对象的指针拷贝,而不是传递给对象本身的拷贝。指向对象的指针按值传递给函数。希望这段代码可以帮助解释它。

public void example(int i, Object o) {}

public static void main(String[] args) {

    Object o = new Object();

    example(3, o);//This is passing the number 3 to the function. It also passes by vlue a pointer to where object o is stored in memory.
}

关于C++ 视角下的 Java 对象和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25092216/

相关文章:

java - CompletableFuture 与 flatMap 的等价物是什么?

java - Django 中的 MessageSource 等效项?

c++ - 如何使用SSE2实现8bit madd

c++ - vector <X*>* 与 vector <X>*

C++ 非直接包含场景

java - SimGrid-3.13 无法加载类

java - 选择器、轮询、Netbeans 平台应用程序和性能分析解释

java - 同步块(synchronized block) : "expression expected"

C++ 错误 : Type Name is Not Allowed

c++ - 类方法访问