Java “什么时候?”;新";创建新对象以及何时复制引用?

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是

我有以下代码,有一个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是什么)。如果我有两个目标,为什么会这样?我的意思是我真的很困惑…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中可以说的是,对于同一个对象,你可以有多个引用,仅仅是一个赋值就导致指向另一个引用。