基元与Java中的对象

时间:2013-12-11 22:02:27

标签: java object pass-by-reference primitive pass-by-value

我正在尝试为考试做一些练习,需要一些帮助(我是否正确地做了?如果没有,为什么?)关于java原语和java对象的这些问题。这些都是 true false

  1. 以下变量声明是对动态分配并存储在堆中的对象的引用:int x = 7;

    错误,因为它是按值传递的,因为int是原始的

  2. 以下变量声明是对动态分配并存储在堆中的对象的引用:Integer x = 7;

    True ,因为它引用存储在堆上的对象

  3. 如果将(1)中声明的变量'x'传递给方法,则该变量通过引用传递,并且其值可以被被调用的函数修改。

    错误,因为Java只传递了值

  4. 如果将(2)中声明的变量'x'传递给方法,则复制该方法 变量是在堆中创建的,并传递给函数,以便函数的对象 引用指向内存中的不同位置。

    True ,因为变量位于堆栈中,但它指向堆中的某个位置

  5. 谢谢大家的帮助。

4 个答案:

答案 0 :(得分:1)

  

4)如果将(2)中声明的变量'x'传递给方法,则复制   该变量是在堆中创建的,并传递给函数,   这样函数的对象引用指向一个不同的   放在记忆中。

好的,这可能有点粗略。如果处理对象,则不会创建对象的副本并将副本传递给方法。您正在为对象创建参考的副本,并按值传递它。

答案 1 :(得分:0)

实际上有2个错误的原因 - 但它可能不是设置它的人所期望的原因。

 Integer x = 7;

将变成:

 Integer x = Integer.valueOf(7);

将重新使用-128到+127范围内所有整数的缓存值。 (它也可以将它们重用于其他值)。

因此,您将获得对JVM实现相关缓存存储中存在的对象的引用,以获取常见的Integer值。

答案 2 :(得分:0)

False,因为Integer是一个对象。因此,您将仅传递对函数中对象地址的引用。它是Java的标准。

答案 3 :(得分:0)

(4)是错误的,原因有两个:

  • “在堆中创建该变量的副本”为false。只有对象在堆上。函数中的局部变量不在堆上。简单地传递该变量的值,即复制到被调用函数的堆栈帧中。
  • “函数的对象引用指向内存中的不同位置。”是假的。函数的引用将指向内存中的相同位置。这是传递点 - 函数内部变量的值与传递的值相同。引用的值是它指向的位置。