是Java中传递对象的内存消耗

时间:2013-11-24 23:59:52

标签: java object

当我将一个Object传递给Java中的另一个类时 - 这个内存消耗与否?对象是否作为某种指针运行,例如c语言?

或者当它传递给另一个类的构造函数时 - 我正在制作该对象的副本?

例如在Android

 Context context

 Class Foo = new Foo(this.context);

3 个答案:

答案 0 :(得分:2)

Java中的对象根本没有传递。对象引用按值传递。传递引用不会复制内容,因此在传递时只使用几个字节(引用类型的大小),请参阅此处以获得更多说明:Is Java "pass-by-reference" or "pass-by-value"?

将对象引用传递给构造函数没有特定的语义。它完全取决于构造函数是否创建内容的副本。

答案 1 :(得分:2)

对象引用实际上是指针,它们存储内存地址。它们不存储对象数据的实际副本。例如,Java中的代码:

Object o = new Object();
System.out.println(o.toString());

与C ++中的此代码相同(假设有Object类):

Object *o = new Object();
cout << o.toString();

在C ++中,您可以根据需要传递对象数据的实际副本。这在Java中是不可能的,因为只有指针并且不占用大量内存会更有效。

但是,如果将对象传递给构造函数(或任何方法),它可以随意执行任何操作,包括复制它(使用clone)或从中收集一些数据以使用它在构建自己。因此构造函数可以创建一个副本,但是你不是仅通过将对象传递给构造函数来制作副本。

另请参阅:Is Java "pass-by-reference"?

答案 2 :(得分:0)

When I pass an Object to another Class in Java首先,你永远不会传递object是Java。 Java中的所有内容都是通过值。对象的处理方式有所不同。 对象引用按值传递。因此,如果您尝试传递实际发生的对象,则传递该对象的引用。并且被调用的方法创建它自己的对象引用副本(通过值原则传递)。 is this memory consuming or not答案是。在创建引用副本时,在堆栈上使用 32位内存(在32位JVM中)指向堆上的同一对象。