在Java中定义复制构造函数

问题描述 投票:3回答:3

这是我的班级:

class Cat {
    static int lives = 9;
    private String name;
    private int age;
    public Cat(String s, int i) {
        name = s;
        age = i;
    }
    public Cat(Cat c) {
       // Failed attempt to define Copy Constructor
        return new Cat(c.name,c.age);
    }
    public String toString() {
        return (name + ", " + age);
    }
}

我想定义复制构造函数,以便我可以从现有的对象实例化Cat的新对象。像这样:

Cat Garfield = new Cat("Garfield",10);
Cat Tom = new Cat(Garfield);

当我尝试它时,它给了我复制构造函数定义的编译错误。请帮我理解什么是错的。是的,构造函数不能有返回类型,但我们在这里返回对Cat的引用。

java constructor copy-constructor
3个回答
7
投票

不要这样做

return new Cat(c. ...

this(c.name, ...)

构造函数不会通过返回返回对象!


3
投票

构造函数不返回任何内容。在构造函数中,您将获得新对象的“骨架”(参考this),并根据需要正确初始化它。

所以第一步是使用该引用调用正确的构造函数,以初始化基本的东西:

this( c.name, c.age );

然后,由于这是一个复制构造函数,并且据说你想获得原始Cat的完整副本,如果你有任何字段,你应该继续初始化其余的字段。

例如,如果你有一个字段int remainingLives,它在你的普通构造函数中被初始化为lives,但是其他Cat已经失去了三个生命,那么你将不得不跟随对构造函数的调用

remainingLives = c.remainingLives;

否则它不会是真正的副本。


1
投票

您的复制构造函数应该看起来像

public Cat(Cat c) {
  name = c.name;
  age = c.age; 
 }

(假设您使用此构造函数使用'Cat'的现有对象创建class'Cat'的对象)

© www.soinside.com 2019 - 2024. All rights reserved.