【问题标题】:How many objects are being created in this code snippet此代码段中创建了多少对象
【发布时间】:2019-08-22 16:51:05
【问题描述】:

将为此代码创建多少个对象?

class Main {
  int num;
  public static void gacemarks(Main m)
  {
    m.num += 10;
  }
  public static void main(String[] args) {
    Main m1 = new Main();
    Main m2 = m1;
    Main m3 = new Main();
    m2.num = 60;
    gacemarks(m2);
    System.out.println(m2);
  }
}

答案是 2。 但我得到了3个。 m1 将被创建,m2 指的是同一个对象 新建m3,调用后生成m对象。

【问题讨论】:

  • 我知道这是一个重复的问题。但我无法理解这段代码。
  • 您将对象引用 (m1,m2,m3,m) 与它们引用的对象混淆了。只有在调用 new 语句(或 clone() 方法,但这是另一回事)时才会创建对象。
  • m1m2 指的是 one Main 对象。 m3 指的是另一个 Main 对象。总共有 2 个 Main 对象。
  • gacemarks(m2); 之后尝试System.out.println(m2.num)。那么你应该得到 70,因为m 是对m2 所引用的对象的引用。 (我假设 System.out.println(m2) 没有显示,因为您没有覆盖 toString())。
  • 它确实返回了十六进制代码!!! @托马斯

标签: java oop methods


【解决方案1】:

在您的代码上下文中,我看到的唯一两个显式创建的对象是出现new 运算符的行:

Main m1 = new Main();
Main m3 = new Main();

以下是每一行中发生的细分:

Main m1 = new Main();     // create new Main object 'm1'
Main m2 = m1;             // assign 'm2' to reference 'm1' (no new object)
Main m3 = new Main();     // create new Main object 'm3'
m2.num = 60;              // assign a field in 'm2' (no new object)
gacemarks(m2);            // repeatedly increment the 'm2.num' field (no new object)
System.out.println(m2);   // print 'm2' (no new object)

【讨论】:

  • 因此,对方法的调用不会创建新对象,而是在传递的同一个对象引用上工作。
  • @NemalyPraveen 是的,没错。至少,当您引用字段 num 时,您正在递增作为参数传入的对象的字段。
  • @NemalyPraveen 您可能听说过 Java 是按值调用的,这可能会让您感到困惑。这是真的,但有一个问题:当你传递一个对象的引用时,例如在gacemarks(m2); 中,值是引用本身,即mm2 的副本,但它们都只是对同一对象的引用(类似于C++ 中的指针)。
  • 是的,@Thomas 这些可以称为按值传递的对象引用。
【解决方案2】:

答案是2

没错。一起来数数吧:

m1 将被创建

对,那是你的第一个对象。

m2指向同一个对象

再次正确,没有添加新对象;计数仍为 1。

m3 新建

那是你的第二个。

在调用之后,会生成m 对象。

代码中没有m 对象:当您将m2 传递给其他方法时,不会创建副本。因此最终的计数仍然是两个。

【讨论】:

  • 那么,通过代码你指的是主要方法??
  • @NemalyPraveen 不,他指的是您的所有代码。 m 是对已传递对象的引用,因此它不引用 new 对象。
  • @NemalyPraveen 是的,这就是所有行动发生的地方。除非main 直接或间接调用它,否则不会执行任何代码。
【解决方案3】:

尽管在代码中直接创建了两个Main 对象(使用new 运算符),但可以说System.out.println(m2); 由于调用了toString() 而创建了一个额外的String 对象。

【讨论】:

  • 好收获+1。也许这应该是一个面试问题。
  • @TimBiegeleisen 另一个可能是在调用main() 时创建的String[] args 数组。很难说出问题的真正含义。
  • 实际上,您正在打开一个潘多拉的盒子,因为您不知道那里创建了多少对象。这取决于实施。在Integer.toHexString() 中创建了一个字符串,然后将其连接到类名等其他内容(可能会或可能不会创建对象)以创建另一个字符串。
  • 嗯,我明白“答案是 2。但我得到了 3。”因为“正确的答案是 2。但我得到了 3,这是错误的。” - 所以我怀疑所有其他对象,包括字符串,都被考虑在内。 :)
  • 我猜它通常是指用户创建的对象。不是自动生成的。
猜你喜欢
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2012-05-13
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多