Java中的原语与对象

Java中的原语与对象,java,object,pass-by-reference,primitive,pass-by-value,Java,Object,Pass By Reference,Primitive,Pass By Value,我正在为考试做一些练习,需要一些关于java原语和java对象的问题的帮助(我做得正确吗?如果没有,为什么?)。这些都是正确的或错误的 以下变量声明是对动态分配并存储在堆中的对象的引用:int x=7 错误,因为它是传递值,因为int是原语 以下变量声明是对动态分配并存储在堆中的对象的引用:整数x=7 True,因为它正在引用堆上存储的对象 如果将(1)中声明的变量“x”传递给方法,则该变量将通过引用传递,其值可能会被调用的函数修改 错误,因为Java只按值传递 如果将(2)中声明的变量“x”传

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

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

    错误,因为它是传递值,因为int是原语

  • 以下变量声明是对动态分配并存储在堆中的对象的引用:整数x=7

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

  • 如果将(1)中声明的变量“x”传递给方法,则该变量将通过引用传递,其值可能会被调用的函数修改

    错误,因为Java只按值传递

  • 如果将(2)中声明的变量“x”传递给方法,则 变量在堆中创建,并传递给函数,以便函数的对象 引用指向内存中不同的位置

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

  • 谢谢大家的帮助

    4) 如果将(2)中声明的变量“x”传递给一个方法,则会生成一个副本 在堆中创建该变量的, 使函数的对象引用指向一个不同的 放在记忆中


    好吧,这可能有点粗略。如果处理对象,则不会创建对象的副本并将副本传递给方法。您正在创建对象引用的副本,并通过值传递该副本。

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

     Integer x = 7;
    
    将变成:

     Integer x = Integer.valueOf(7);
    
    这将对-128到+127(含)范围内的所有整数重新使用缓存值。(也可以将其用于其他值)


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

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

    (4)为假有两个原因:

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

    我不相信4)--IIRC,引用的副本被放在堆栈上,尽管引用的对象仍然在堆中。4)对我来说似乎是错误的;传递引用的副本,但该副本指向同一个对象,该对象在堆上进行一些测试,打印值,在内部更改之前和之后,您将得到答案。因此您认为此缓存不在堆上?它可能在堆上,但肯定不会“动态分配”(第一次之后,至少取决于它是否是缓存的延迟分配)。所以你说对象可以被延迟分配。那么,当它被分配时,如果不是动态分配,它是如何分配的?字面上说,该语句说“对象…是动态分配的”。它没有说对象是何时动态分配的。如果只发生一次,它就不是非常动态的…你不妨说我的房子是动态放置的-因为在他们决定在那里建造时它是动态的,即使从那以后它从未移动过。动态分配意味着每次你做整数x=7时都会创建一个新的-事实并非如此。