Java “什么时候?”;新";创建新对象以及何时复制引用?
我有以下代码,有一个p类如下:Java “什么时候?”;新";创建新对象以及何时复制引用?,java,Java,我有以下代码,有一个p类如下: class P { char c; P (char c){ this.c = c; } } 然后在程序中有: P p = new P('a'); void m1 (P p, char z){ p = new P(z); } m1(p, 'd'); 我的问题是,在方法m1被执行之后,我的初始对象p(对其具有“a”)是否会改变其引用,并将指向另一个p,该对象具有z所持有的内容。或者我会有两个对象p,一个有‘a’,另一个有z(不管z是
class P {
char c;
P (char c){
this.c = c;
}
}
然后在程序中有:
P p = new P('a');
void m1 (P p, char z){
p = new P(z);
}
m1(p, 'd');
我的问题是,在方法m1被执行之后,我的初始对象p(对其具有“a”)是否会改变其引用,并将指向另一个p,该对象具有z所持有的内容。或者我会有两个对象p,一个有‘a’,另一个有z(不管z是什么)。如果我有两个目标,为什么会这样?我的意思是我真的很困惑…m1(p,'d');取我的p,我在开始时初始化了它,现在它应该指向另一个对象了?请记住,Java是。因此,您的m1
方法接收p
值的副本,但它无法更改外部p
本身
void m1 (P p, char z){
p = new P(z); // this only changes the method argument 'p', not the outer 'p'
}
void someOtherMethod()
P p = new P('a');
m1(p, 'z');
// p has not changed
}
在
m1
方法中,您可以简单地创建一个新的p
对象。一旦您的方法完成,该对象就有资格进行垃圾收集,因为没有对它的实时引用。Java只是传递值
在你的情况下,想象一下我们有一个班级电视:
public class Tv {
boolean on;
int channel;
String model;
Tv (String model) {
this.model = model;
}
public void turnOn(){
this.on = true;
}
}
所以现在我们在亚马逊订购了一台电视——耐心等待4-5天。
与此同时,我们只为电视买了一个遥控器。既然有
没有电视可以控制,我们可以玩遥控器,但是
什么也不会发生。在Java中,您会说“创建一个参考rcTv,它
指电视
Tv rcTv; // our Tv remote control
仍然没有电视可以控制。现在门在敲门,哎呀!我们的电视在那里。
在java中,您说现在有一个Tv实例
new Tv(loewe) // create an instance of an TV-Object
但是如果你不能控制电视(打开/关闭…),它的用途是什么呢!!!
现在我们必须把遥控器分配给电视。
在java中,可以说引用对象的实例
rcTv = new Tv(loewe); // make rcTv to refer to our Tv-Object
你甚至可以有另一个遥控器
Tv rcTv2 // new Remote control (reference)
rcTv2 = rcTv; // make rcTv2 to control the same Tv as rcTv
给它分配(复制)上一个遥控器的值
Tv rcTv2 // new Remote control (reference)
rcTv2 = rcTv; // make rcTv2 to control the same Tv as rcTv
现在,他们都指的是同一款电视型号Loewe。
我们写了一个改变电视机型号的方法
Tv changeModel (Tv tvarg, String model){
return tvarg = new Tv(model);
}
创建第三个遥控器,与其他两个遥控器一样指向同一台电视
Tv rcTv3 = rcTv; // create another Tv remote-control
现在,您可以将Loewe Tv与所有三个RCs合并。
更改最后一个RC的模型
rcTV3 = changeModel (rcTv, "samsung")
您可以假设,在此调用之后,rcTv将引用一个新的Tv实例(三星)
但正如上面提到的JAVA->只需按值传递
关键是你给了这个方法一个参考(对于c/c++-指针),它可以
指电视对象
只要JAVA只是传递值,您的引用(rcTV)就会被复制
进入方法参数(tvarg)(阅读将rcTv克隆到tvarg)。
现在,它们都将引用相同的Tv->Loewe
但之后
tvarg = new Tv(samsung);
您已经创建了一个新的TV对象,同时现在强制tvarg
引用该Tv对象并将其返回。
那以后呢
rcTV3 = changeModel (rcTv, "samsung")
您的rcTv仍将引用Tv Loewe,您的rcTv3将引用Tv Samsung
关于,您只需尝试一下就可以回答第一位。另外,为什么会混淆?new创建了一个新对象;如果您两次调用它,您将得到两个对象。因为java是按值传递的,即使
p
在m1
构造函数中是新的,当它返回p指向的位置时,也不会更改。-1您的第二个代码片段无效。你不能在没有方法的情况下调用m1(p,'d');
。你的问题让我很困惑,我在java中可以说的是,对于同一个对象,你可以有多个引用,仅仅是一个赋值就导致指向另一个引用。