Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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_Constructor_Copy_Clone - Fatal编程技术网

未调用复制构造函数,但默认构造函数称为java

未调用复制构造函数,但默认构造函数称为java,java,constructor,copy,clone,Java,Constructor,Copy,Clone,我尝试了复制构造函数和克隆()来复制Room对象,但每次它都提供相同的对象,并且不复制。我发现它总是调用参数化构造函数。 我调用文件室副本构造函数的代码的一小部分: package primary; public class Room implements Cloneable{ int room_no; private int leftStrength; //number of students sitting on left side private int rig

我尝试了复制构造函数和克隆()来复制Room对象,但每次它都提供相同的对象,并且不复制。我发现它总是调用参数化构造函数。 我调用文件室副本构造函数的代码的一小部分:

package primary;

public class Room implements Cloneable{

    int room_no;
    private int leftStrength; //number of students sitting on left side
    private int rightStrength;//number of students sitting on right side
    private int capacity;
    private int timeSlot;
    private boolean checkBig;
     boolean invigilanceRequired;
    private int rightCapacity;
    private int leftCapacity;
    public Room(int room_no,int capacity)
    {
        this.room_no=room_no;
        this.capacity=capacity;
        rightStrength=0;
        leftStrength=0;
        timeSlot=0;
        checkBig=true;
        invigilanceRequired=true;
        rightCapacity=capacity;
        leftCapacity=capacity;
    }

    public Room(Room other)
    {
        this.room_no=other.room_no;
        this.capacity=other.capacity;
        this.rightStrength=other.rightStrength;
        this.leftStrength=other.leftStrength;
        this.timeSlot=other.timeSlot;
        this.checkBig=other.checkBig;
        this.invigilanceRequired=other.invigilanceRequired;
        this.rightCapacity=other.rightCapacity;
        this.leftCapacity=other.leftCapacity;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }

}
当我打印上述两个对象save1和time1中的任何变量时,它们是不同的

我正在添加输入命令和输出

TimeInterval save1=new TimeInterval(time1);
输出:

旧时代1号,5号房间剩余容量60

旧时代2号,5号房间剩余容量60

旧时光2号,5号房间右力量0

旧时间1,房间5剩余容量0

旧时代2号,5号房间剩余容量60


旧时间2,5,时间1,右强度60,

< P> java没有复制的构造函数,与C++一样。 您已经创建了两个构造函数,一个获取房间号和容量,另一个从现有房间创建一个。您没有默认构造函数。此外,Java中没有自动使用“复制构造函数”。相反,如果您想要创建副本,那么您可以显式地调用您创建的房间(房间)构造函数来创建副本

问题是您希望使用“clone”方法调用Room(Room)构造函数吗?在这种情况下,如果需要,可以从“clone”方法内部调用它


当你说他们不同时,你是什么意思?您是否正在打印地址并注意到它们是不同的物理对象?还是说应该相同的参数不相同?

我已经解决了这个问题。我在所有构造函数中打印了一些内容,并逐行调试。我发现这个语句(TimeInterval save1=newtimeinterval(time1);)导致了这个问题。 我写下我在步骤中发现的内容:

  • 当TimeInterval save1=新的时间间隔(time1)时;开始执行时,它调用了房间的参数化构造函数(我错误地称之为default)。然后它调用了房间的复制构造函数

  • 但我希望它只是调用房间的复制构造函数。然后,我发现我在TimeInterval类的复制构造函数之外创建了一些Room对象(不仅是引用,还通过调用'new'关键字创建了整个对象)

  • 我把这些行放在TimeInterval类的参数化构造函数中创建房间对象的地方

  • 问题解决了

  • 打印错误值的问题:当TimeInterval类使用参数化构造函数创建房间对象时(对于在TimeInterval类中的构造函数外部写入的行),它将我在房间对象中打印的那些变量初始化为默认值(即0)。然后,它调用了房间的复制构造函数,只是复制了这些房间对象(其变量具有默认值),而不是我想要的那些房间对象的副本


  • 您能更清楚地说明问题是什么,以及您是如何得出问题的结论的吗?我已经打印了save1和time1中的rightStrength变量。save1显示0。时间1显示60。它在循环中,因此time1随时间而更改,save1应将更改后的值复制到rightStrength。但实力仍然是0。因此,我得出结论,它正在调用参数化构造函数。如果
    TimeInterval
    上有一个
    rightstence
    变量,您就没有显示它。请发表评论。向评论中添加代码格式不正确,请尝试编辑您的问题。(如果您同时提供所使用的打印语句以及您得到的结果和期望的结果,这将有所帮助。精确性有助于解决StackOverflow问题。)您的问题与默认构造函数无关。我已明确调用了Room copy构造函数。我已经提到了代码。for(Room:other.rooms){Room temproome=new Room(Room);this.rooms.add(temproome);}变量在这两个对象中有不同的值。您可能需要改写问题的标题。您的问题似乎与副本的字段是否更新有关?我仍然不能100%理解您的问题是什么,但我感觉到您的代码中的某个地方正在更新rightStrength值,但它没有按照您希望的方式进行更新?是的,它正在按照我希望的方式进行更新。但当我复制time1并将其保存到save1时。time1显示正确的更新值。但是save1显示了我在默认(参数化)构造函数中输入的值
    TimeInterval save1=new TimeInterval(time1);
    
    System.out.println("Old time 1,Room 5 capacity left                           "+save1.R4.getRightCapacity());
    System.out.println("Old time 2,Room 5 capacity left "+save2.R4.getRightCapacity());
    System.out.println("Old time 2,Room 5 right strength "+save2.R4.getRightStrength());
    System.out.println("Old time 1,Room 5 capacity left "+time1.R4.getRightCapacity());
    System.out.println("Old time 2,Room 5 capacity left "+time2.R4.getRightCapacity());
    System.out.println("Old time 2,Room 5 time 1 right strength "+time1.R4.getRightStrength());