【问题标题】:Java Objects and Pointers from C++ Perspective [duplicate]从 C++ 角度看 Java 对象和指针 [重复]
【发布时间】:2014-08-02 06:07:55
【问题描述】:

我最近读了这篇文章: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++ 的方式使用“引用”一词。如果你想在 C++ 方面对 Java 所做的事情进行类比,那么指针和我创建的规则是理解 Java 行为的最简单的术语。

【问题讨论】:

  • 你所有的观察都是正确的。 Java 没有“C++ 引用”之类的东西。这就是为什么你不能在 Java 中编写交换函数的原因。

标签: java c++


【解决方案1】:

第 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 点在技术上是正确的。

基元按值传递。 一种 将对象传递给函数时,它会将指针的副本传递给对象,而不是传递给对象本身的副本。指向对象的指针按值传递给函数。希望这个 sn-p 可以帮助解释它。

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.
}

【讨论】:

  • Java 总是按值传递。即使传递一个对象,它也是按值传递的。所以:void example(int i, Object o) { o = null; },使用您的示例,main 方法中的o 不会为空。阅读:stackoverflow.com/questions/40480/…
  • 我喜欢人们投票反对你的方式。他们的学究气真的让刚接触 C++ 的 Java 程序员无法理解这种简单的情况。
  • 最后一段令人困惑/不正确。在 java 中将对象传递给函数不像在 C++ 中通过引用传递对象。
  • @gyroninja 在 C++ 中通过引用传递与传递指针完全不同。
  • @user2837260 在 Java 中根本无法传递对象。您可以在 Java 中传递的只是原始值和引用。按价值。
猜你喜欢
  • 2011-02-12
  • 2011-05-20
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多