Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改Java中对象的地址(再次按值传递??)_Java_C++_Pointers_Pass By Reference_Pass By Value - Fatal编程技术网

更改Java中对象的地址(再次按值传递??)

更改Java中对象的地址(再次按值传递??),java,c++,pointers,pass-by-reference,pass-by-value,Java,C++,Pointers,Pass By Reference,Pass By Value,在我发布我的问题之前,我已经阅读了以下关于java传递值的优秀文章。 我相信我已经很好地理解了它 我的问题与Java与其他支持通过引用传递的语言的比较有关(C++) 对于Java,您有一个句柄(引用)指向位置a中的对象。因此可以修改对象本身。但无法更改对象位置本身。 即,存储在内存地址0X945中的对象不能更改为0X948 在诸如C++之类的语言中,您可以选择按值传递或按引用传递。(它在程序员手中,对吗?)。因此,有可能更改对象在内存空间中的位置是否正确 P.S.P:我有很好的java背景,

在我发布我的问题之前,我已经阅读了以下关于java传递值的优秀文章。 我相信我已经很好地理解了它

  • 我的问题与Java与其他支持通过引用传递的语言的比较有关(
    C++

    对于
    Java
    ,您有一个句柄(引用)指向位置a中的对象。因此可以修改对象本身。但无法更改对象位置本身。 即,存储在内存地址0X945中的对象不能更改为0X948

    在诸如
    C++
    之类的语言中,您可以选择
    按值传递
    按引用传递
    。(它在程序员手中,对吗?)。因此,有可能更改对象在内存空间中的位置是否正确

    P.S.P:我有很好的java背景,但是C++。所以我上面的观点可能是错误的。 我在上面引用的第1条中声称,Java中没有指针的概念。我不知道这是真的吗?(为什么
    NullPointerException
    会存在)

    编辑: 考虑这个例子:

    void swap(Object A,Object B) {
      Object temp=B;
      Object B=A;
      Oject A=temp;
    }
    
    当我在Java中调用该方法时,比如
    swap(A,B)
    ,什么都没有发生
    但是在C++中,交换发生了。这可能意味着我正在更改内存中对象的位置,对吗?

    Java总是按值传递,只是当您传递对象时,传递的值就是内存中的位置,因此它可以像按引用传递一样进行传递。

    在Java中,甚至-对对象的引用是按值传递的。i、 一切都是按价值传递的。其次,

    您可以选择按值传递或按引用传递。(它在程序员手中,对吗?)。 对的但是你不能用Java来做

    存储在内存地址0X945中的对象不能更改为0X948。 在java和C++中,你不能这样做。 当您尝试访问某个不存在的属性/方法(即
    null
    )时,将引发
    NullPointerException
    )。i、 e,当需要对象的实例时,引用指向
    null

     Object o = null;
     o.toString()  --> NPE. o points to null.
    
    P> >在C++中,通过引用,意味着传递对象本身,以便可以在交换方法

    中重新分配它。 <>在C++中,通过引用,<代码>交换(对象和A,对象和B)< /> >似乎接近java的传递值。 在Java
    中,对象A
    是对对象的引用,默认情况下为
    null
    。由于
    对象
    已经是一个引用,因此当复制此引用时,它将按值传递

    <> > C++中,<>代码>对象A//C>是对象的实例,并且始终是唯一对象。由于
    对象
    是一个实例,因此使用
    对象&
    通过引用传递,因为
    对象
    不是传递的,而是对它的引用

    当我在Java中调用swap(A,B)之类的方法时,除了 在C++中(假设),交换发生。 不,没有。“没有”也发生在C++中。 正确地将代码翻译成C++是:

    void swap(Object *A,Object *B) {
      Object *temp=B;
      B=A;
      A=temp;
    }
    

    (是的,不同类型的语法之间有区别),即,在爪哇中,指针->代码> Foo类型被写为 Foo*<代码>,在C++中<>代码> Foo;这只是语言之间的句法差异。)

    java总是通过值。@ ElliottFrisch:是的,这完全是我脑中的根基。但我的问题是,可以将对象的位置从内存地址A更改为内存地址B。我认为,在通过引用支持的语言(例如C++正确)中,这是可能的。不,java中不可能,C++中不可能。如果传递指针的引用,C++中的对象的位置可能改变。AFAIK java中不存在等价的特性,但是您可以添加一个间接级别——通过值传递对对象的引用,该对象具有对所讨论对象的引用。这将让你分配一个新的目标对象实例,并使调用方知道它。因为我对C++没有任何了解,请原谅我的错误。但是我认为交换(对象A,对象B)在C++中工作,因为你交换对象的位置,这在java中是不可能的。那么,传递引用与传递值有什么不同呢?+1用于回答实际问题。当需要引用对象时,尝试使用null值时,会引发NullPointerException。请参阅API文档,了解可能导致这种情况的一些情况的列表:那么,按引用传递有什么不同呢?在按引用传递而不是按值传递的情况下,可以将存储在内存地址中的对象更改为不同的位置。请更正……不。在通过引用传递的
    中,我将把引用传递给对象。因此,您可以实际处理原始对象。在“传递值”中,传递对象的值(而不是实际对象的引用)。在java中,您要做的是,通过值传递引用,以便可以访问实际对象。在原始对象上进行检查,甚至在传递值中进行检查。传递引用的副本,该副本仍然指向同一对象。我会调查你提供的链接。但是,你能解释一下为什么交换(对象A,对象B)在C++中工作,而不是在java中工作?Thanks@brainstorm-它也可以在java中工作。只是你不需要交换功能。您可以用任何方法执行
    temp=A
    A=B
    B=temp
    。在这里,您只是重新分配和交换引用对象,在C++中,您仍然可以通过“代码>交换(对象*A,对象*B)< /COD>正确传递对象本身。有些方法,我遗漏了一些东西,因为在处理对象时,按引用传递和按引用传递值是如何不同的(对于原语,这一点很清楚)。@brainstorm
    Object*
    是一个指针,它可能指向一个对象。此指针必须是非常量,因此不能