更改Java中对象的地址(再次按值传递??)
在我发布我的问题之前,我已经阅读了以下关于java传递值的优秀文章。 我相信我已经很好地理解了它 我的问题与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背景,
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类型被写为
中,我将把引用传递给对象。因此,您可以实际处理原始对象。在“传递值”中,传递对象的值(而不是实际对象的引用)。在java中,您要做的是,通过值传递引用,以便可以访问实际对象。在原始对象上进行检查,甚至在传递值中进行检查。传递引用的副本,该副本仍然指向同一对象。我会调查你提供的链接。但是,你能解释一下为什么交换(对象A,对象B)在C++中工作,而不是在java中工作?Thanks@brainstorm-它也可以在java中工作。只是你不需要交换功能。您可以用任何方法执行temp=A
,A=B
,B=temp
。在这里,您只是重新分配和交换引用对象,在C++中,您仍然可以通过“代码>交换(对象*A,对象*B)< /COD>正确传递对象本身。有些方法,我遗漏了一些东西,因为在处理对象时,按引用传递和按引用传递值是如何不同的(对于原语,这一点很清楚)。@brainstormObject*
是一个指针,它可能指向一个对象。此指针必须是非常量,因此不能